- private API : 사용할 수 있는 사용자 혹은클라이언트를 제한해야 함
- public API : 공용으로 오픈되어 있으므로 굳이 사용자 혹은 클라이언트를 제한해야 하지는 않지만, 사용 횟수 제한, 남용 방지, 사용자 통계 등의 이유로 인증 엔드 포인트 필요
API를 개발 할 때 인증 엔드포인트 필수!
인증
인증: 사용자의 신원을 확인하는 절차 ==> 로그인 기능을 구현해주는 것이 인증 엔드 포인트
- 사용자 가입 절차를 진행하여 사용자의 아이디와 비밀번호 생성
- 가입한 사용자의 아이디와 비밀번호를 데이터베이스에 저장, 이때 사용자의 비밀번호는 암호화해서 저장
- 사용자가 로그인할 때 본인의 아이디와 비밀번호 입력
- 사용자가 입력한 비밀번호를 암호화한 후, 그 값을 이미 암호화되어서 DB에 저장된 비밀번호와 비교
- 비밀번호가 일치하면 로그인 성공
- 로그인에 성공하면 백엔드 API 서버는 access token을 프론트엔드 혹은 클라이언트에게 전송
- 프론트엔드 서버는 로그인 성공 후 다음부터는 해당 사용자의 access token을 첨부해서 request를 서버에 전송함으로써 매번 로그인하지 않아도 되도록 함
사용자 비밀번호 암호화
그렇다면 사용자 비밀번호를 데이터베이스에 저장할 때 암호화해서 저장하는 이유는 무엇일까?
상식적으로 생각해보면 사생활 침해 때문일 것이다!
- 외부의 해킹 공격에 의해 데이터베이스가 노출되었을 경우에 대비
- 내부 인력에 의해 데이터베이스가 노출되었을 경우에 대비
해킹한 데이터베이스를 사용해 해당 사용자의 다른 정보에도 노출될 수 있는 가능성이 높아지기 때문에 꼭 비밀번호를 암호화하여 저장해야 한다!
그래서 만일 데이터베이스가 해킹당해서 사용자의 데이터들이 외부로 노출되었다고 해도 해커가 해당 사용자들의 비밀번호를 알 수 없게 하기 위함이다
사용자들의 비밀번호가 암호화가 되어 앞으로 해커에게 노출되어도 실제 비밀버호 값을 알 수 없게 함으로써 피해를 최소화시킬 수 있다.
단방향 해쉬 함수(one-way hash function)
사용자의 비밀번호를 암호화랑 때는 단방향 해쉬 함수가 일반적으로 쓰인다.
- 복호화를 할 수 없는 암호화 알고리즘
- 사용자의 비밀번호를 데이터베이스에 저장할 때는 복화하할 목적으로 저장하지 않고, 온전히 본래의 비밀번호 값을 알지 못하도록 방지하는 데에 목적이 있는 것
그러나, 단방향 해시 암호 알고리즘은 취약점이 있고 충분히 해킹이 가능하다.
rainbow attack
rainbow attack로 해킹이 가능하다.
rainbow attack : 미리 해시 값들을 계산해놓은 테이블인 rainbow table이라는 테이블을 먼저 생성해 놓은 후 해시 함수 값을 역추적해서 본래 값을 찾아내는 해킹 방법
즉, 해시 값을 복호화하는 것이 아니라, 사전에 가능한 연문과 숫자 그리고 기호 조합들로 구성된 다양한 스트링값들을 연산한 후 그 값들을 미리 해시 암호화해 놓은 후, 해시 값끼리 매칭하는 방식으로 본래 암호값을 찾는 방식.
이러한 단방향 해시 함수의 취약점을 보안하기 위해 일반적으로 2가지 보완점들이 사용됨
▶ salting
실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시 값을 계산하는 방법
본래 비밀번호에 랜덤 값을 더해서 해시화 하기 때문에 혹시나 해킹을 당한 경우에도 해커가 실제 어느 부분이 실제 비밀번호값이고 어느 부분이 랜덤값인지 알 수 가 없게 됨
▶ 키 스트레칭
단방향 해시 값을 계산한 후 그 해시 값을 또 해시하고, 이를 여러 번 반복하는 방법
즉 여러번 해시 함수를 적용시켜서 해시 값을 계산하는 것
bcrypt
salting과 키 스트레칭을 구현한 해시 함수 중 가장 널리 사용되는 알고리즘
처음부터 비밀번호를 단방향 암호화하기 위해 만들어진 해쉬 함수
파이썬에서 bcrypt를 사용하여 암호화할 수 있음
pip install bcrypt
'백엔드' 카테고리의 다른 글
엔드포인트 데이터베이스 사용하여 구현하기 (0) | 2021.08.17 |
---|---|
SQLAlchemy (0) | 2021.08.17 |
API에 데이터베이스 연결하기 (0) | 2021.08.16 |
SQL(Structured Query Language) (0) | 2021.08.10 |
데이터베이스(Database) (0) | 2021.08.10 |