
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 : 토큰에 대한 정보를 담기 위해 이미 정해진 claimpublic 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 합니다.