JWT(Json Web Token)란?

컴업·2023년 12월 19일
0
post-custom-banner

JWT란 JSON 형식을 이용하여 사용자에 대한 속성을 Claim이라는 포멧(”이름”)으로 저장하는 WebToken 기술이다.

말이 어렵지만 결론은 아래와 같이 사용자 속성을 가진 JSON 데이터를 암호화 한 토큰이라고 생각하면 되고, 각 사용자 속성을 claim이라 정의한다고 이해하면된다.

구조

1. Header

헤더는 토큰 타입, 사용된 signature 알고리즘에 대한 정보를 담고있다.

  • typ (Type): 토큰의 타입을 지정한다. (JWT로 설정된다.)
  • alg (algorithum): signature에 사용된 알고리즘을 명시한다.
    - 예를 들어, HMAC SHA256 (HS256) 또는 RSA.

헤더는 일반적으로 JSON 포멧으로 표기되며, Base64Url로 인코딩되어 JWT의 첫 번째 부분을 구성한다.

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

2. Payload

페이로드는 토큰에 담길 실제 데이터를 의미한다. 각각의 데이터는 key:value 형태이며 Claim이라고 불린다.

클레임은 세 종류로 나뉜다.

  • Registered Claim: Calim의 key값은 임의의 값을 사용할 수 있으나, JWT에서 미리 정의한 key 이름을 사용할 수 있다. 이러한 claim을 Registered Claim이라한다.
    - 예를들어, iss(isuer), exp(expiration time), sub(subject) 등이 있다.
  • Public Claim: Registered와 달리 사용자가 직접 정의하는 클레임이다. 그중 public claim은 공개용 정보를 위해 사용된다. 일반적으로 url 형식을 많이 사용한다.
{
	"https://example.com/jwt/claims/user_email" : "email@email.com"
}

** 말이 좀 어려운데 JWT가 여러 시스템 또는 조직 간에 사용될 때, email과 같이 간단한 이름을 사용하면 클레임의 의미가 충돌 할 수 있다. 같은 email이지만 어느 시스템에서는 user_email을 또 다른 시스템에서는 company_email을 의미할 수 있기 때문이다.

  • Private Claim: 시스템 양측 간의 합의에 따라 사용되는 사용자 정의 클레임이다.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

2. Signature

Signature는 발급자의 인증을 확인하기 위한 부분이다. 이를 생성하기 위해, Header와 Payload를 Base64Url로 인코딩한 뒤, 서버의 비밀 키를 사용하여 지정된 알고리즘으로 해시를 생성한다.

profile
좋은 사람, 좋은 개발자 (되는중.. :D)
post-custom-banner

0개의 댓글