JWT의 구조(Header + Payload + Signature)

jiji·2023년 11월 23일
0

Backend

목록 보기
1/4

업로드중..

😮 jwt 토큰은 네트워크로 전송하기 때문에 공간을 적게 차지해야한다. 그래서 Json 으로 데이터를 저장할 때, Key를 3글자로 줄인다!

1. Header

{
	// Signature를 해싱하기 위해 사용한 알고리즘
    "alg": "HS256"	
    "typ": "JWT",	// 타입
}

2. Payload

❗ 민감한 정보는 담지 않는다!

{
  "sub": "(토큰 제목)",
  "iss": "(발행인)"
  "exp": "(유효 시간)"
  "iat": "(토큰 발급 시간)"

Claim

  • 사용자나 토큰에 대한 property를 key-value 형태로 저장한다.
  • 토큰에서 사용할 정보의 조각들, Payload에 담길 데이터를 입력

표준 Claim

= 미리 정의된 클레임

  • iss(issuer) : 토큰 발급자
  • sub(subject) : 토큰 제목 - 토큰에서 사용자에 대한 식별 값
  • aud(audience) : 토큰 대상자
  • exp(expiration time) : 토큰 만료 시간
  • nbf(not before) : 토큰 활성 날짜(이 시각 이전의 토큰은 활성화되지 않음을 보장한다)
  • iat(issued at) : 토큰 발급 시간
  • jti(jwt id) : 토큰 식별자(issuer가 여러명 일 때 구분하기 위해 사용)

사용자 정의 Claim

  1. 충돌 방지를 위해 URI 포맷을 이용한다. [공개]
  2. 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다. [비공개]
{
  "token_type" : "access token"
}

3. Signature

  • 시그니처는 토큰이 유효한지 위조되었는지를 확인하기 위해 사용된다.
  • 여기에는 서명이 저장되는데 암호화되어 있기 때문에 서버에 있는 개인 키로만 복호화가 가능하다.
  1. 헤더(Header) & 페이로드(Payload) 인코딩 (by BASE64)
  2. 인코딩한 값을 해싱 (by 비밀 키 + Header의 "alg" 알고리즘)
  3. 해싱한 값을 다시 인코딩 (by BASE64)
  4. Signature 완성!

signWith()에는 서명 알고리즘과 비밀 키가 들어간다. 서명 알고리즘으로 HS256을 선택한다면 비밀 키는 별도의 클래스에서 관리한다. 비밀 키는 공개되어서는 안되기 때문에 깃 허브에 올릴 때는 해당 파일을 .gitignore에 추가하도록 하자.

0개의 댓글