로그인을 위해서 필요한 것은 '인가(Authorization)'이다. 인가는 유저가 요청하는 request를 실행할 수 있는 권한이 있는 지를 확인하는 절차!
서버는 이를 위해 headers에 access token을 만들어서 보내는데, 이 정보를 'Json Web Token(JWT)'라고 한다.
jwt를 사용하기 위해서는 PyJWT 라이브러리를 설치하여야 한다.
pip install pyjwt
파이썬 인터프리터를 실행해준다.
import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt입니다.
SECRET = 'secret' #'랜덤한 조합의 키' 예제이므로 단순하게 'secret'이라고 하겠습니다.
access_token = jwt.encode({'id' : 1}, SECRET, algorithm = 'HS256')
print(access_token)
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'
jwt의 결과물은 pyjwt의 버전에 따라 bytes
(ver. 1.7)타입 또는 str
(ver. 2.0 이상)타입.
(설치된 pyjwt의 버전을 확인하고, jwt의 ecode 결과의 타입에 따라 btyes
→ str
의 과정을 진행해야 한다.)
이렇게 발급된 토큰은 어떻게 사용할 수 있을까? 바로 프론트엔드 엔지니어에게 전달해야 하는 것!
그렇다면 이제 인증을 위한 기본 요건이 달성 되었으니, 인증을 통과한 사용자만 접근하려면 토큰을 받아서 다시 우리가 발행한 토큰이 맞는지 확인 해야겠죠?
header = jwt.decode(access_token, SECRET, algorithm = 'HS256')
print(header)
{'id': 1}
decode 결과는 바로 우리가 encode 할 때 넘겼던 header값인 { 'id' : 1}입니다. 이 말은 우리가 담아 넘기는 header 값을 통해 유저를 식별할 수 있다는 이야기입니다.
인증하는 코드는 어디에 구현해야 할까?
바로 엔드포인트에 데코레이터를 구현해야 합니다.
데코레이터 구현은 보통 user app에 utils.py를 만들어서 작성합니다.
(user app?? utils.py???? 열심히 또 공부를 해봐야겠다....)