인증은 사용자(user)의 신원(identification)을 확인하는 절차다. 대부분의 API에서 공통적으로 구현하는 기능이다.
인증 절차로는 :
1. 사용자 가입 절차를 진행해서 사용자의 아이디와 비밀번호를 생성
2. 가입한 사용자의 아이디와 비밀번호(비밀번호는 암호화)를 DB에서 저장
3. 사용자가 로그인할 때 본인의 아이디와 비밀번호 입력
4. 사용자가 입력한 비밀번호를 암호화한 후, 그 값을 미리 DB에 저장해놨던 비밀번호랑 비교
5. 일치하면 로그인 성공
6. 로그인에 성공하면 백엔드 API 서버는 access token을 클라이언트 측에 보낸다.
7. 클라이언트는 로그인 후, 요청할 때 access token을 첨부해 보내 매번 로그인 하지 않아도 됌.
사용자의 비밀번호를 암호화해서 저장하는 이유는 크게 2가지가 있다.
사용자들은 보통 어떤 서비스던 비슷한 비밀번호를 사용하는 경향이 있어 비밀번호가 노출된다면 보안에 큰 문제가 생길 것이다.
사용자의 비밀번호를 암호화할 때는 단방향 해시 함수(one-way hash function)가 일반적으로 쓰인다. (복호화 할 수 없는 함수)
그렇다고 해킹의 위협으로부터 완벽히 안전할 수는 없다. (사실 정보보호병 하면서 제일 기억 남았던 말이 "제일 안전한 방어는 연결을 안하는 것" 이다...
그래서 밑에 여러 암호화 기법들을 볼 것이다.
위에서 설명했듯이 완벽한 보안은 없다. 그래서 책에서는 대표적인 비밀번호 해킹 방법 rainbow attack(해시 함수 값을 역추적해서 본래 값을 찾아내는 해킹)에 대안으로 Bcrypt 암호화 방법을소개한다.
Bcrypt의 가장 큰 특징은 salting과 key stretching이다.
pip install bcrypt
import bcrypt
bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).
bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).hex() #윗 줄은 16진수 값으로 생성
터미널에서 위에 코드로 bcrypt 실습을 해볼 수 있다.
클라이언트 측에서 백엔드 서버에 로그인을 했다고 증명할 수 있는 데이터이다.
HTTP가 stateless라서 꼭 필요한 기능이다.
access token을 생성하는 방법은 여러 가지가 있는데, 가장 널리 사용되는 기술 중 하나가 JWT(JSON Web Tokens)다.
*이름 그대로 JSON 데이터를 token으로 변환하는 방식이다. (영어 어려운 거 없다!)
JWT의 구조 :
private뿐 아니라 public API에서도 공통적으로 구현하는 중요한 인증(authentication)기능을 구현했다.
인증 엔드포인트와 그 적용 실습 코드는 제 깃헙 타임라인을 참고하거나 다른 분들의 코드를 확인하면 되겠습니다.