JWT(Json Web Token)
1. 토큰(Token) ✍🏼
2. JWT(Json Web Token)이란?
1) 개념
- Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
- 인증에 필요한 정보들(JSON 객체)을 암호화 시킨 토큰
- JWT에는 암호화된 회원정보가 들어있으며 복호화하여 사이트내의 서비스를 사용할 수 있는지 없는지를 확인하는데 사용된다 =
인가(Authorizationathon)
- 회원 인증을 해야하는 상황에서 주로 사용
- 유저 정보를 담은 JSON 데이터를 암호화해서 client와 server 간에 주고 받는 것

2) 구조

JWT는 헤더(header), 정보(payload), 서명(signature)으로 이루어짐
- typ: 토큰의 타입을 지정. JWT
- alg: 해싱 알고리즘을 지정. 주로 HMAC SHA256 또는 RSA 사용
이 알고리즘은, 토큰을 검증 할 때 사용되는 signature 부분에서 사용됨
정보(payload)
- 토큰에 담을 정보가 들어있음
- 여기 담는 정보의 한 조각을 클레임(claim)이라고 부르고 name & values의 객체형으로 담김
- 클레임의 정보는 등록된 (registered) 클레임, 공개 (public) 클레임, 비공개 (private) 클레임으로 세 종류
서명(signature)
- 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성
- 디코딩을 하면 누구나 헤더와 페이로드의 내용을 볼 수 있음
- 이 부분을 만드는 슈도코드(pseudocode)의 구조
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
3) 실습
- 먼저 JWT를 위한 라이브러리 설치 후 불러오기
$ pip install PyJWT # 라이브러리 설치는 PyJWT
# 파이썬 쉘 실행
import jwt # import할 때는 jwt
data = {'user_id':3}
>>> encoded_jwt = jwt.encode(data, 'secret', algorithm='HS256')
>>> encoded_jwt
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozfQ.mU
nSxfiXA4zkxTrIVT3l2FRBMfTcHTLOd5oVHDaKnWo'
>>> type(token)
<class 'bytes'>
>>> jwt.decode(encoded_jwt, "secret", algorithms="HS256")
{'user_id': 3}
>>> type(token)
<class 'str'>
encode 할 때는 altgorithm
이고, decode 할 때는 s가 붙어서 algorithms
이다
인가 (Authorization)
개념
- 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차
- 인가도 JWT를 통해서 구현될 수 있음
- access token을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 가능
절차
- Authorization 절차를 통해 access token을 생성. access token에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 함(ex. user_id)
- 유저가 request를 보낼 때 access token을 첨부해서 보낸다
- 서버에서는 유저가 보낸 access token을 복호화한다
- 복호화된 데이터를 통해 user_id를 얻는다
- user_id를 사용해서 databases에서 해당 유저의 권한을 확인한다.
- 유저가 충분한 권한을 가지고 있으면 해당 요청을 처리한다
- 유저가 권한을 가지고 있지 않으면 에러 Unauthorized Response(401) 혹은 다른 에러 코드를 반환