JWT란? (Json Web Token)

함승완·2024년 10월 15일

Json 웹 포맷을 사용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.
토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 전달한다.
주로 회원 인증이나 정보 전달에 사용된다.

구조

JWT는 Header, Payload, Signature의 3부분으로 이루어진다.
Json형태인 각 부분은 Base64Url로 인코딩 되어 표현된다.
각각의 구분을 이어 주기 위해서 구분자를 사용하여 구분

토큰의 헤더는 typ와 alg 두 가지 정보로 구성된다. alg는 헤더를 암호화 하는것이 아닌 Signature를 해싱하는 알고리즘을 지정하는것.

  • typ : 토큰의 타입을 지정
  • alg : 알고리즘 방식을 지정하며 서명 및 토큰 검증에 사용된다.
{
	"alg": "HS256",
    "typ": JWT
}

Payload

토큰에서 사용할 정보의 조각들인 클레임이 담겨있다.
클레임은 총 3가지로 나누어지고 Json(Key/Value) 형태로 다수의 정보를 넣을 수 있다.

등록된 클레임(Registered Claim)

토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터들이다
모두 선택적으로 작성이 가능함.
JWT를 간결하게 하기 위해 key는 모두 길이 3의 String으로 이루어져있음
여기서 Subject는 unique한 값을 사용해야한다. (ex - 유저이메일)

  • iss: 토큰 발급자 (issuer)
  • sub: 토큰 제목 (subject)
  • aud: 토큰 대상자 (audience)
  • exp: 토큰 만료 시간 (expiration), NumericDate 형식으로 되어있어야함.
  • ndf: 토큰 활성 날짜 (not before), 이 날이 지나기 전의 토큰은 활성화 X
  • iat: 토큰 발급 시간 (issued at), 토큰 발급 이후의 경과 시간을 알 수 있음.
  • jti: JWT토큰 식별자 (JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Token) 등에 사용

Signature(서명)

토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유의 암호화 코드이다.
서명은 위에서 만든 헤더와 페이로드의 값을 각각 base64Url로 인코딩하고 인코딩한 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱한 후 이 값을 다시 base64Url로 인코딩하여 생성한다.

사용방법

HTTP 통신을 할 때 Authorization에 {key: value}로 사용된다.
예시

{

	"Authorization": "Bearer {Token}",
}

단점

  1. 클레임에 많은 정보를 넣을 시 Token의 길이가 늘어나서 네트워크에 부하를 줄 수 있다.
  2. Payload에서 인코딩 방식이 base64Url이기 때문에 중요한 정보(사용자 비밀번호)를 넣으면 탈취 한 뒤 Decoding해서 볼 수 있기에 중요한 정보는 넣지 않아야 한다.
profile
좋은 개발자 좋은 코딩 좋은 컴퓨터

0개의 댓글