주요 개념 정리

JWT (JSON WEB TOKEN)

Ykie 2023. 4. 7. 11:39
728x90

JWT 는 유저를 인증하고 식별하기 위한 토큰(Token)기반 인증이다. RFC 7519 에 자세한 명세가 나와있다. 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다. JWT 가 가지는 핵심적인 특징이 있다면, 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함(Self-contained)된다는 것이다. 데이터가 많아지면 토큰이 커질 수 있으며 토큰이 한 번 발급된 이후 사용자의 정보를 바꾸더라도 토큰을 재발급하지 않는 이상 반영되지 않는다.

일반적으로 JWT 를 사용하면 아래와 같은 순서로 진행된다.

  1. 클라이언트 사용자가 아이디, 패스워드를 통해 웹서비스 인증.
  2. 서버에서 서명된(Signed) JWT 를 생성하여 클라이언트에 응답으로 돌려주기.
  3. 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT 를 HTTP Header 에 첨부.
  4. 서버에서 클라이언트로부터 온 JWT 를 검증.

JWT는 Header, Payload, Signature 로 구성된다. 또한 각 요소는 . 으로 구분된다.
Header 에는 JWT 에서 사용할 타입과 해시 알고리즘의 종류가 담겨있으며 Payload 는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다. 마지막으로 Signature 에는 Header, Payload 를 Base64 URL-safe Encode 를 한 이후 Header 에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있다. 

JWT은 서명(인증)이 목적이다.
JWT는 Base64로 암호화를 하기 때문에 디버거를 사용해서 인코딩된 JWT를 1초만에 복호화할 수 있다.
복호화 하면 사용자의 데이터를 담은 Payload 부분이 그대로 노출되어 버린다. 그래서 페이로드에는 비밀번호와 같은 민감한 정보는 넣지 말아야 한다. 토큰의 진짜 목적은 
정보 보호가 아닌, 위조 방지이다

// npm i jsonwebtoken
// import * as jwt from 'jsonwebtoken';
const token = jwt.sign({ id: user.id }, SECRET_KEY, option_{ algorithm: 'RS256' });
>> xxxxx.yyyyy.zzzzz

728x90