[Spring] JWT

WOOK JONG KIM·2022년 11월 8일
0
post-thumbnail

JWT란?

JWT(JSON Web Token)은 당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰

JWT는 URL로 이융할 수 있는 문자열로만 구성돼 있으며(HTTP 구성 요소중 어디든 위치 가능), 디지털 서명이 적용돼 있어 신뢰 가능

서버와의 통신에서 권한 인가를 위해 주로 사용

구조

JWT는 점( . ) 으로 구분된 아래의 세 부분으로 구성됨

  • 헤더(Header)
  • 내용(Payload)
  • 서명(Signature)

헤더

JWT 헤더는 검증과 관련된 내용을 담고 있으며, 두가지 정보(alg, typ)를 포함 하고 있다

예제

{
	"aig" : "HS256"
    "typ" : "JWT"
}

aig에서는 해싱 알고리즘 지정
-> 보통 SHA256 또는 RSA 사용하며, 토큰을 검증할 때 사용되는 서명 부분에 사용

HS256은 HMACSHA256을 사용하겠단 의미
-> typ 속성에서는 토큰 타입 지정

완성된 헤더는 Base64Url 형식으로 인코딩돼 사용됨

내용(payload)

JWT의 내용에는 토큰에 담는 정보를 포함, 여기 포함된 속성들을 클레임이라 함

크게 3가지로 구분

  • 등록된 클레임(Registered Claims)
  • 공개 클레임(Public Claims)
  • 비공개 클레임(Private Claims)

등록된 클레임은 필수는 아니지만 토큰에 대한 정보 담기 위해 이미 이름이 정해져 있는 클레임 의미

등록된 클레임은 다음과 같이 정의돼 있음

  • iss : JWT의 발급자(issuer) 주체를 나타냄. iss 값은 문자열이나 URI를 포함하는 대소문자를 구분하는 문자열
  • sub : JWT의 제목(Subject)
  • aud : JWT의 수신인(Audience), JWT는 처리하려는 각 주체는 해당 값으로 자신을 식별해야 하는데 처리할려는 주체가 aud 값으로 자신을 식별하지 않으면 JWT는 거부됨
  • exp : JWT 만료시간(Expiration)
  • nbf : Not Before 의미
  • iat : JWT가 발급된 시간(issued at)
  • jti : JWT의 식별자(JWT ID)

공캐 클레임은 키 값을 마음대로 정의할 수 있음(충돌이 안되는 범위 내)

비 공개 클레임은 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임 의미

{
	"sub" : "wikibooks payload",
    "exp" : "1602076488",
    "userId" : "wikibooks",
    "username" : "flature"
}

서명

JWT의 서명 부분은 인코딩된 헤더, 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성

서명은 토큰의 값들을 포함해서 암호화하기 때문에 메세지가 도중에 변경되지 않았는지 확인 할 때 사용

서명 생성 방식

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

JWT 디버거 사용하기

htts://jwt.io/#debugger-io

profile
Journey for Backend Developer

0개의 댓글