
웹 서비스를 사용할때, 보통은 회원 가입 및 로그인을 하고 사용이 가능합니다. 이과정들에서 어떠한 기술들이 필요한지 정리하였습니다.
유저의 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을 다른 사용자가 안다면 복호화를 할 수 있으므로, 유출되서는 안됩니다.