웹 서비스를 사용할때, 보통은 회원 가입 및 로그인을 하고 사용이 가능합니다. 이과정들에서 어떠한 기술들이 필요한지 정리하였습니다.
유저의 identification을 확인하는 절차
access token
을 클라이언트에게 전송.access token
을 첨부해서 request를 서버에 전송함으로서 매번 로그인 해도 되지 않도록 한다.유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차 이다.
access token
을 생성한다. access token
에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다. (예를 들어 user id)access token
을 첨부해서 보낸다.access token
을 복호화 한다.유저의 비밀번호는 절대 그대로 DB에 저장하면 안됩니다.
비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰입니다.
다이제스트(digest)
를 생성합니다.단방향성(one-way)
이라고 합니다.패스워드 저장을 목적으로 설계되어 매우 강력한 패스워드 다이제스트를 생성하는 시스템을 쉽게 구현할 수 있다. 관련된 라이브러리도 언어별로 쉽게 찾을 수 있습니다.
# 비밀번호 암호화 하기
In [42]: hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
In [43]: hashed_password
Out[43]: b'$2b$12$FyPZgflEujF6H.Ur2aZHIuOqFmOM.lzgS8zVRQ1SAlmUiPOmSihCG'
# 비밀번호 확인
In [46]: bcrypt.checkpw('1234'.encode('utf-8'), hashed_password)
Out[46]: True
양방형성
이라고 합니다.access token
을 생성하는 방법중 가장 널리 사용되는 기술중 하나SECRECT_KEY = 'asdfghjkl'
# 암호화
In [53]: hashed_user_id = jwt.encode({'user_id': '100'}, SECRECT_KEY, algorithm='HS256')
In [54]: hashed_user_id
Out[54]: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiMTAwIn0.Q2gKLee212mZtPKqD0GzIlmAt64mRPqqu8CQ7OE3a6M'
# 복호화
In [55]: jwt.decode(hashed_user_id, SECRECT_KEY, algorithms='HS256')
Out[55]: {'user_id': '100'}
SECRECT_KEY와 algorithm을 다른 사용자가 안다면 복호화를 할 수 있으므로, 유출되서는 안됩니다.