13.3 JWT(JSON Web Token)

김찬미·2024년 7월 1일
0

JWT란?

JWT (JSON Web Token)은 정보를 안전하게 JSON 형식으로 전송하기 위한 토큰이다. 주로 클라이언트와 서버 간의 인증에 사용되며, 디지털 서명을 통해 신뢰성을 보장한다. JWT는 URL에서 사용할 수 있는 문자열로 구성되어 있어 HTTP의 어느 구성 요소에나 위치할 수 있다.


JWT 구조

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

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

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

헤더(Header)

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

{
    "alg" : "HS256",
    "typ" : "JWT"
}
  • alg:
    • 해싱 알고리즘(SHA256 or RSA)을 지정한다.
    • 토큰을 검증할 때 사용되는 서명 부분에서 사용된다.
  • typ:
    • 토큰의 타입을 지정한다.
    • 일반적으로 JWT인 경우 "JWT"라고 명시된다.

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

내용(Payload)

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

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

1) 등록된 클레임 (Registered Claims)

등록된 클레임은 JWT의 표준적인 클레임들로, 토큰에 특정 정보를 제공하기 위해 미리 정의된 것들입니다. 이들은 선택적으로 사용될 수 있다.

  • iss: JWT를 발급한 발급자(issuer)를 식별한다.

  • sub: JWT의 주제(subject)를 나타낸다. 사용자 ID와 같은 고유 식별자가 될 수 있다.

  • aud: JWT의 대상(audience)을 나타내며, 토큰을 받아들일 대상을 지정한다.

  • exp: 토큰의 만료 시간(Expiration Time)을 나타낸다.

  • nbf: Not Before를 의미한다.

  • iat: JWT가 발급된 시간(Issued At)을 나타낸다.

  • jti: JWT의 고유 식별자(JWT ID)이다. 주로 중복 처리 방지를 위해 사용된다.

2) 공개 클레임 (Public Claims)

공개 클레임은 사용자 정의 클레임으로, 키 값을 마음대로 정의할 수 있다. 다만 충돌이 발생하지 않을 이름으로 설정해야 한다. 예를 들어, 사용자의 이름, 이메일 주소와 같은 정보가 포함될 수 있다.

3) 비공개 클레임 (Private Claims)

비공개 클레임은 사용자 정의 클레임으로, JWT를 생성하고 소유한 사람들만이 사용할 수 있는 클레임이다. JWT의 서버와 클라이언트 간(통신 간)에 상호 합의되고 사용된다. 이는 토큰의 사용자 정의 데이터를 포함할 수 있는 곳이다.

JWT 내용 예시

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "email": "john.doe@example.com",
  "role": "user"
}
  • "sub"는 등록된 클레임이다.
  • "name", "admin", "email", "role"은 공개 클레임이다.

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

서명(Signature)

JWT의 서명 부분은 인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성된다. 예를 들어 HMAC SHA256 알고리즘을 사용해서 서명을 생성하면 아래와 같은 방식으로 생성된다.

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

서명은 JWT 메세지가 변조되지 않았음을 검증하는 데 사용된다. 서버는 수신한 JWT의 헤더와 내용을 다시 해시하여 생성된 서명과 비교함으로 토큰의 유효성을 검증한다.


JWT 디버거 사용하기

JWT 공식 사이트에서는 더욱 쉽게 JWT를 생성해볼 수 있다. 웹 브라우저에서 다음 URL로 접속하면 아래와 같은 화면을 볼 수 있다.

이 화면은 EncodedDecoded로 나뉘어져 있으며, 양측의 내용이 일치하는지 사이트에서 확인할 수도 있고 Decoded의 내용을 변경하면 Encoded의 콘텐츠가 자동으로 반영된다.

💡 Tip
JWT와 관련된 자세한 내용은 공식 사이트에서 확인할 수 있다.
https://jwt.io/introduction/

profile
백엔드 개발자

0개의 댓글

관련 채용 정보