반응형

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

JWT는 URL로 이용할 수 있는 문자열로만 구성되어 있으며, 디지털 서명이 적용되어 있어 신뢰할 수 있음.

JWT는 주로 서버와의 통신에서 권한 인가를 위해 사용된다. URL에서 사용할 수 있는 문자열로만 구성되어 있기 때문에 HTTP 구성요소 어디든 위치할 수 있다.

 

JWT의 구조

 

JWT는 점('.')으로 구분된 아래의 세 부분으로 구성되어있다.

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

따라서 JWT는 일반적으로 아래와 같은 형식을 띠고 있다.

 

헤더

 

JWT의 헤더는 검증과 관련한 내용을 담고 있다. 헤더에는 두 가지 정보를 포함하고 있는데, 바로 alg와 typ 속성이다.

 

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

 

alg 속성에는 해싱 알고리즘을 지정한다. 해싱 알고리즘은 보통 SHA256 또는 RSA를 사용하며, 토큰을 검증할 때 사용되는 서명 부분에서 사용된다.

위의 예제에 있는 HS256은 'HMAC SHA256' 알고리즘을 사용한다는 의미, 그리고 typ 속성에는 토큰의 타입을 지정

 

이렇게 완성된 헤더는 Base64Url 형식으로 인코딩되어 사용된다.

 

내용(Payload)

 

JWT의 내용에는 토큰에 담는 정보를 포함합니다. 이곳에 포함된 속성들은 클레임(Claim)이라 하며, 크게 세 가지로 분류된다.

 

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

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

등록된 클레임은 다음과 같이 정의되어 있다.

  • iss: JWT의 발급자(Issuer) 주체를 나타낸다. iss의 값은 문자열이나 URI를 포함하는 대소문자를 구분하는 문자열
  • sub: JWT의 제목(Subject)이다.
  • aud: JWT의 수신인(Audience)이다. JWT를 처리하려는 각 주체는 해당 값으로 자신을 식별해야 한다. 요청을 처리하는 주체가 'aud' 값으로 자신을 식별하지 않으면 JWT는 거부된다.
  • exp: JWT의 만료시간(Expriation)입니다. 시간은 NumericDate 형식으로 지정해야한다.
  • nbf: 'Not Before'를 의미
  • iat: JWT가 발급된 시간(Issued at)이다.
  • jti: JWT의 식별자(JWT ID)이다. 주로 중복 처리를 방지하기 위해 사용

공개 클레임은 키 값을 마음대로 정의할 수 있다. 다만 충돌이 발생하지 않을 이름으로 설정해야 한다.

 

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

 

{
    "sub": "junyeoke payload",
    "exp": "123241546",
    "userId": "junyeoke",
    "username": "junhyuk"
}

 

이렇게 완성된 내용은 Base64Url 형식으로 인코딩되어 사용

 

서명

 

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

예를 들어, HMAC SHA256 알고리즘을 사용해서 서명을 생성한다면 아래와 같은 방식으로 생성된다.

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

 

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

반응형

'Spring Boot' 카테고리의 다른 글

스프링 시큐리티  (0) 2024.01.26
front + backend 게시판 CRUD 구현 (1)  (0) 2023.10.19

+ Recent posts