본문 바로가기
JWT

JWT(Json Web Token)

by holy season 2023. 4. 20.
반응형

JWT란?

JWT는 Json Web Token의 약자이다.

Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token

웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격

사용자의 인증(authentication) 또는 인가(authorization) 정보를 서버와 클라이언트 간에 안전하게 주고받기 위해서 사용

모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미

JWT 구조

JWT 구조는 Header, Payload, Signature로 구분된다.

Header, Payload, Signature는 모두 JSON 형식을 따르며 각 부분은 Base64로 인코딩 되어 표현된다.

Header, Payload, Signature의 각 부분을 이어 주기 위해 마침표 구분자를 사용해 구분한다.

Header

Header는 토큰의 타입을 정하는 부분과 사용될 서명 알고리즘을 정하는 2가지 부분으로 나누어진다.

서명 알고리즘은 HMAC SHA256 이나 RSA 같은 알고리즘을 사용할 수 있다.

토큰의 타입은JWT를 사용한다면 "JWT"로 설정해두어야 한다.

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

Payload

Payload는 claim을 포함한다.

claim은 객체와 추가적인 데이터에 대한 상태를 나타낸다

claim은 Registered, Public, Private으로 구분된다.

Registerd claim

필수적이지는 않지만 권장되는 미리 정의된 claim의 집합

토큰 정보를 표현하기 위해, 이미 정해진 종류의 데이터

공식적(표준)으로 사용되는 클레임

  • iss : 토큰 발급자 (issuer)
  • sub : 토큰 제목 (subject), 유니크한 값을 사용한다. (주로 사용자 이메일)
  • aud : 토큰 대상자 (audience)
  • exp : 토큰 만료 시간 (expiration), NumericDate 형식
  • nbf : 토큰 활성 날짜 (not before), 해당 날이 지나기 전의 토큰은 활성화되지 않는다.
  • iat : 토큰 발급 시간 (issued at), 토큰 발급 이후의 경과시간을 알 수 있다.
  • jti : JWT 토큰 식별자 (JWT ID), 중복 방지를 위해 사용한다. 일회용 토큰(Access Token) 등에 사용된다.
{
	"iss" : "holy-season",
    "email" : "holy-season.gmail.com"
}

Public Claim

사용자 정의 클레임

공개용 정보를 위해 사용

충돌 방지를 위해, URI 포맷을 이용하거나  IANA JSON Web Token Registry를 이용

Private Claim

정보를 공유하기위해 정의할 수 있는 claim

서버와 클라이언트 사이에 임의로 지정한 정보를 저장

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Payload나 Header에 있는 데이터는 누구나 읽을 수 있기 때문에 중요한 정보는 넣지 않도록 해야 한다.

Signature

인코딩 된 Header, Payload와 secret 키를 합쳐 해시화하여 Signature를 생성한다.

Signature는 메시지가 변경되지 않았다는 것을 검증하는 데에 쓰인다 

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

ecoded(header).encoded(payload).Signature로 토큰이 생성되게 된다

참고 주소

https://jwt.io/introduction

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

https://taegyunwoo.github.io/tech/Tech_JWT
https://brunch.co.kr/@jinyoungchoi95/1
https://datatracker.ietf.org/doc/html/rfc7519
https://pronist.dev/143
https://www.daleseo.com/jwt/
https://tech.toktokhan.dev/2021/04/30/JWT/

반응형