로그인과 서비스 기능 구현 시 알아야 할 인가의 개념과 JWT(JSON Web Token)에 대해서 알아보도록 하자.
access token
을 생성한다. access token
에는 user id 등 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다.access token
을 첨부해서 보낸다.access token
을 복호화 한다.access token
을 생성하는 방법은 여러가지가 있는데, 그 중 가장 널리 사용되는 기술중 하가 바로 JWT(JSON Web Tokens)이다.typ
과 alg
두 가지 메타정보를 가지고 있다.{"typ":"JWT","alg":"HS256"}
헤더는 BASE64 방식으로 인코딩해서 JWT의 가장 첫 부분에 기록된다.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
name:value
의 한 쌍으로 이뤄져있다. 토큰에는 여러개의 클레임 들을 넣을 수 있다.iss
- 토큰 발급자(issuer), exp
- 토큰의 만료시간(expiraton) 등이 있고 optional이다.pyjwt을 설치한다.
pip install pyjwt
pyjwt를 import한다. 패키지명은 pyjwt이지만 임포트할때의 이름은 jwt이다.
import jwt
access token
을 발급한다.
# 시크릿키와 알고리즘 방식은 중요한 정보이므로 my_settings.py등에 따로 저장하고 import해서 사용하는 게 좋다
SECRET = 'secret_example'
ALGORITHM = 'HS256'
access_token = jwt.encode({'id' : 1}, SECRET, algorithm = ALGORITHM)
참고로, v2.0.0 이상의 pyjwt이라면 jwt.encode의 반환값이 bytes
타입이 아니라 string
타입이다.
print(access_token)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI
type(access_token)
<class 'str'>
로그인이 성공하면 위와 같은 방식으로 발행한 토큰을 프론트엔드에게 전달하면 된다.
전달받은 토큰을 프론트 쪽에서 로컬 스토리지, 세션 스토리지, 쿠키 등 어디에 저장할지는 서비스에 따라 다르다.
인증을 통과한 사용자만 접근하려면 토큰을 받아서 다시 우리가 발행한 토큰이 맞는지 확인 해야한다. decode할 때는 algorithm
이 아닌 algorithms
으로 입력해야 한다.
header = jwt.decode(access_token, SECRET, algorithms = 'HS256')
decode 결과는 바로 우리가 encode 할 때 넘겼던 payload값인 {'id' : 1}
이다.
이 값을 통해 권한이 있는 유저인지 식별할 수 있다.
print(header)
{'id': 1}
pyjwt v2.0.0 버전에 따른 이슈는 이 블로그에 잘 설명되어 있다.
참고사이트
https://velopert.com/2389
https://velopert.com/2350
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://phin09.tistory.com/61
수아님~! 수아님 포스팅 덕분에 로그인 데코레이터 해결했어요~~ 감사합니다 >< 잘 보고 갑니다❤️🍒