JWT란?

bluewhale·2021년 9월 2일
0

JWT란?

JWTJson Web Token의 약자로 클라이언트-서버, 서비스-서비스 통신에서 Authorization을 위해 토큰 기반의 인증 방식에서 사용되는 토큰이다.

JWT 구조

JWT 토큰은 Header, Payload, Signature 세 파트로 구성된다.

Header는 토큰의 종류와 서명(signature)을 생성하기 위해 사용된 알고리즘의 종류에 대한 정보를 담고 있다. Header에 저장된 정보는 base64 인코딩되어 JWT에 포함된다.

{
  "typ":"JWT",
  "alg":"HS256"
}

Payload

Payload는 토큰과 관련된 주요 정보들을 담고 있다. Payload에 저장된 정보는 Claim이라고 한다. Claim은 3가지 종류가 있다.

  1. Registered Claim Names
    Registered claim은 사전에 정의된 claim에 해당된다. 대표적으로 iss(issuer), sub(subject), exp(expiration time) 등이 있다.

  2. Public Claim Names
    사용자가 정의한 claim으로 공개용 정보들을 담고 있다. 충돌 방지를 위해, 일반적으로 uri 포맷의 키를 사용한다.

  3. Private Claim Names
    토큰의 발행자가 임의로 정한 정보로, 대부분의 일반적인 정보는 private claim에 저장된다.

{
  "username":"BlueWhaleKo",
}

Payload에 저장된 정보는 base64 인코딩되어 JWT에 포함된다.

Signature

JWT의 header와 payload에 저장된 정보를 private key와 header에 선언된 해싱 알고리즘으로 암호화한 값에 해당한다. 이를 통해, header와 payload의 위변조 여부를 확인하게 된다.

JWT 특징

모바일 환경에 적합

모바일 환경에서, 쿠키 컨테이너를 별도로 활용해야하는 쿠키 기반의 인증 방식에 비해 비교적 간단하게 적용할 수 있다.

Self-Contained

JWT에서는 클라이언트에 대한 다양한 정보를 payload에 저장하고 이를 base64 인코딩하여 전달한다. JWT 토큰은 그 자체로 사용자의 정보를 담고 있기 때문에 서버에서 이를 관리할 부담이 줄어든다.

Stateless

JWT 인증 방식의 가장 큰 특징 중 하나이다.
기존의 stateful한 웹서버에서는 클라이언트가 서버에 로그인하면 서버가 로그인 정보를 세션에 저장하여 활용한다. 세션 정보를 저장하는 방식은 다양할 수 있으나, 공통적으로 세션을 관리하는 것에 대한 부담이 발생한다.

반면, 서버는 토큰을 발행할 때 사용한 private key를 활용하여 내장된 signature를 검증하는 방식으로 토큰의 유효성과 위변조를 확인한다. 서버가 발행한 토큰은 클라이언트가 관리하므로, 서버는 사용자 인증을 위해 별도로 세션 정보를 유지해야 하는 부담이 줄어든다. 따라서, 서비스가 수평적으로 확장될 수 있다.

References

[JWT] 토큰(Token) 기반 인증에 대한 소개
[JWT] JSON Web Token 소개 및 구조
How To Validate a JWT Token

profile
안녕하세요

0개의 댓글