Jason Web Token

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

토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달

 

JWT구조

Header, Payload, Signature  3부분으로 구성

Json 형태인 각 부분은 Base64Url로 인코딩

각 부분을 이어주기 위해 , 구분자 사용

 

 

Header

alg

Signature를 해싱하기 위한 알고리즘을 지정

 

typ

토큰의 타입을 지정

ex) JWT

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

 

 

 

Payload

토큰에 담을 정보

하나의 정보 조각을 클레임(Claim) 이라고 부르고 이는 name, value 한 쌍으로 이루어 짐

 

클레임의 종류는 크게 3개로 구분

 

register : 등록된 클레임

서비스에 필요한 정보들이 아닌, 토큰에 대한 정보를 담기 위해 이름이 이미 정해진 클레임

등록된 클레임은 모두 선택적 (Optional)

 

  • iss : 토큰 발급자 (Issuser)
  • sub : 토큰 제목 (subject)
  • aud : 토큰 대상자 (audience)
  • exp : 토큰 만료 시간 (expiration)
  • nbf : (not before) 토큰의 활성 날짜와 비슷한 개념, 이 날짜가 지나기 전까진 토큰 처리 X
  • iat : 토큰이 발급된 시간 (issued), 이 값을 활용하여 토큰의 age가 얼마나 되었는지 판단 가능
  • jti : JWT의 고유 식별자, 주로 중복적인 처리 방지를 위해 사용, 일회용 토큰에 사용 시 유용

 

public : 공개된 클레임

공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 함

충돌 방지를 위한 URI 형식의 이름

 

{
    "https://rainover0824.tistory.com//jwt_claims/is_admin": true
}

 

private : 비공개 클레임

서버와 클라이언트 협의 하에 사용되는 클레임 이름

공개 클레임과는 달리 이름이 중복되어 충돌 가능성 존재

 

{
    "username": "rainover"
}

 

 

 

Payload 예시

{
    "iss": "tistory.com",
    "exp": "1485270000000",
    "https://rainover0824.tistory.com/jwt_claims/is_admin": true,
    "userId": "11028373727102",
    "username": "rainover"
}

 

 

Signature (서명)

헤더의 인코딩 값, 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬하여 생성

 

** 서명 부분을 만드는 슈도 코드의 구조

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

 

문자열을 Base64 형태로 표현

 

 

 

 

JWT 예시

 

앞서 설명한 Header, Payload, Signature 을 합치면

 

이런 JWT 생성!

 

'끄적 > BE' 카테고리의 다른 글

Persistence Context (영속성 컨텍스트)  (0) 2023.01.01
Spring MVC  (0) 2022.12.29
JPA, Spring Data Jpa  (0) 2022.12.28
JPA  (0) 2022.12.28
Token을 사용한 로그인 인증  (0) 2022.12.28

+ Recent posts