JWT
토큰은 JSON Web Token
의 약자로 전자 서명된 URL-safe
의 JSON
입니다. JWT
의 대부분의 프로그래밍 언어에서 사용되면서 자기 수용적이라는 특징이 있습니다. 자기 수용적인 JWT
는 시스템에서 발급된 토큰이 토큰에 대한 기본정보, 전달할 내용, 그리고 토큰이 검증됐다는 것을 증명해주는 signature
이 있습니다. .
JWT
는 복호화가 가능하기 때문에 SECRET_KEY
를 잘 관리해주어야 한다.
JWT
는 .
을 구분으로 3가지 영역으로 되어있습니다.
Header
에는 alg
와 typ
가 들어있습니다. typ
는 타입으로 JWT
가 타입이고, alg
에는 알고리즘으 들어가게 됩니다.
Payload
는 토큰에 담을 내용이 담겨있습니다. 그 내용은 여러개의 claim
으로 이루어져 있습니다. 이 claim
은 name
:value
쌍으로 되어있으며 그 종류로는 세가지가 있습니다.
registered claim
: 토큰에 대한 정보를 담기 위해 이미 정해진 claim
public claim
: 충돌을 방지하기 위한 이름을 가지고 있는다.private claim
: 등록되있지도, 공개되지도 않은 claim
Siganture
는 secret Key
를 포함하여 암호화되어있습니다. Header
의 인코딩값과 Payload
의 인코딩값을 합친후 비밀키로 해쉬한다.
Python
에서 JWT
를 사용하기 위해서는 PyJWT
패키지를 설치해야합니다.
pip install PyJWT
import jwt
PyJWT
를 임포트할 때는 jwt
로 가져옵니다.
jwt
로 이제 사용자에게 줄 Token
을 만들 수 있습니다.
token = jwt.encode({"user_id":user_id},SECRET,algorithm="HS256")
만들어진 token
을 JsonResponse
로 프런트엔드에게 줄 수 있습니다. 이렇게 보내진 token
은 로컬 스토리지나 세션 스토리지 또는 쿠키에 저장됩니다.
jwt = require('jsonwebtoken');
jsonwebtoken
을 설치해서 NodeJs에서 jwt
토큰을 발급 받을 수 있습니다. NodeJS에서도 jwt
토큰은 Cookie 스토리지나 로컬 스토리지에 저장하기 위해서 사용됩니다.
sign
토큰을 생성할때 jwt.sign()
메서드를 사용합니다. 인자로 payload
, expireDate
, Algorithm
, SecretKey
가 들어갑니다.
const token = jwt.sign(
{ 'userId': user.id },
SECRET_KEY,
{ expiresIn: '365d' }
);
위의 코드는 Algorithm
이 생략되어 default인 HS256
로 암호화됩니다.
verify
jwt.decode()
메서드를 통해서 복호화 할수도 있지만 대개의 경우 validation을 위해선 jwt.verify()
메서드를 사용하는 것을 추천한다.
const userId = jwt.verify(req.cookies['token'],SECRET_KEY);
jwt.verify()
는 만료된 토큰이 입력되면 Error를 Throw 합니다.