JWT 토큰을 발행해보자

isTuna·2021년 1월 5일
5

Web 개발

목록 보기
11/19

👣 JWT 토큰이란?

JWT 토큰은 JSON Web Token의 약자로 전자 서명된 URL-safeJSON입니다. JWT의 대부분의 프로그래밍 언어에서 사용되면서 자기 수용적이라는 특징이 있습니다. 자기 수용적인 JWT는 시스템에서 발급된 토큰이 토큰에 대한 기본정보, 전달할 내용, 그리고 토큰이 검증됐다는 것을 증명해주는 signature이 있습니다. .

JWT는 복호화가 가능하기 때문에 SECRET_KEY를 잘 관리해주어야 한다.

📱 JWT의 구조

JWT.을 구분으로 3가지 영역으로 되어있습니다.

Header에는 algtyp가 들어있습니다. typ는 타입으로 JWT가 타입이고, alg에는 알고리즘으 들어가게 됩니다.

Payload

Payload는 토큰에 담을 내용이 담겨있습니다. 그 내용은 여러개의 claim으로 이루어져 있습니다. 이 claimname:value 쌍으로 되어있으며 그 종류로는 세가지가 있습니다.

  • registered claim : 토큰에 대한 정보를 담기 위해 이미 정해진 claim
  • public claim : 충돌을 방지하기 위한 이름을 가지고 있는다.
  • private claim : 등록되있지도, 공개되지도 않은 claim

Signature

Siganturesecret Key를 포함하여 암호화되어있습니다. Header의 인코딩값과 Payload의 인코딩값을 합친후 비밀키로 해쉬한다.

🕺🏼 Python에서 JWT 사용하기

Python에서 JWT를 사용하기 위해서는 PyJWT 패키지를 설치해야합니다.

pip install PyJWT

import jwt

PyJWT를 임포트할 때는 jwt로 가져옵니다.
jwt로 이제 사용자에게 줄 Token을 만들 수 있습니다.

token = jwt.encode({"user_id":user_id},SECRET,algorithm="HS256")

만들어진 tokenJsonResponse로 프런트엔드에게 줄 수 있습니다. 이렇게 보내진 token은 로컬 스토리지나 세션 스토리지 또는 쿠키에 저장됩니다.

NodeJS에서 JWT 사용하기

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 합니다.


profile
청소연구소 개발자 (2021. 05~ )

0개의 댓글