JWT

Daeyoung Nam·2021년 8월 3일
3

프로젝트

목록 보기
6/16
post-thumbnail

Json Web Token

JWT는 클라이언트와 서버 사이에서 Authorization을 위해 통신시 http 헤더에 넣어 교환되는 토큰입니다.
RFC7519 표준이며 URL에 포함될 수 있도록 URL-Safe하게 만들어집니다.
JWT는 HMAC 암호화 알고리즘을 사용하여 비밀키 또는 RSA를 이용한 Public Key/Private Key 쌍으로 서명이 가능합니다.

JWT 구성

header.payload.signature

JWT는 . 기준으로 3가지 구성으로 되어있습니다

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

헤더에는 두가지의 정보를 가지고 있으며, 서명에 필요한 알고리즘 정보와 토큰 타입을 지정합니다.
alg의 경우 보통 HMAC SHA256 또는 RSA가 사용되고 이 필드는 토큰을 검증할 때 사용되는 signature부분에서 사용됩니다.

payload

payload에는 토큰에 담을 정보들이 들어가게됩니다.
여기서 담는 정보의 한 조각은 Claim 이라고 불리며 name / value 쌍으로 이뤄져 있습니다.

등록된 클레임

등록된 클레임은 서비스에 필요한 정보가 아닌 토큰에 대한 정보를 담기위해 이름이 이미 정해진 클레임입니다.
등록된 클레임의 모든 필드는 필수가 아닌 Optional입니다.

iss: 토큰 발급자
sub: 토큰 제목
aud: 토큰 대상자
exp: 토큰 만료 시간 (NumericDate)
nbf: 토큰 활성 날짜 (NumericDate) -> 활성 날짜가 지나기 전까진 토큰 사용 불가
iat: 토큰이 발급된 시간
jti: JWT 고유 식별자 주로 중복처리 방지에 활용되고 일회용 토큰에 사용하면 유용함

비공개 클레임

클라이언트 서버 양 측간에 협의하여 사용되는 클레임입니다.

{
	"name": "John Doe",
}

payload를 만들어보자

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

sub, iat 같은 경우는 등록된 클레임 필드이고
name필드는 비공개 클레임 필드로써 현재 해당 페이로드에는 등록된 클레임 2개 비공개 클레임 1개가 사용되어졌습니다.

signature

이 필드는 header의 인코딩값과 payload의 인코딩값을 합친 후 주어진 비밀키로 해쉬를 하여 생성합니다.

HMAC_SHA256(
    base64UrlEncode(JSON.stringify(header)) + 
    "." +
    base64UrlEncode(JSON.stringify(payload)),
    secret
);

결과

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT는 세션 기반 인증방식의 단점을 무효화(?) 시켜줍니다.
세션 기반 인증방식의 경우 서버가 여러대를 사용하는 경우 유저의 세션정보를 관리하기가 힘들어지는데 JWT를 이용하게 되면 토큰하나로 인증/권한 처리가 가능해지기 때문입니다.

profile
내가 짠 코드가 제일 깔끔해야하고 내가 만든 서버는 제일 탄탄해야한다 .. 😎

0개의 댓글