jwt 에 대해 간단히 알아보자.

Intro

  • Json Web Token 에 대해서 간단히 알아보자. 기본적인 암호화 방식 및 기타 잡다한 정보는 나중에도 알고 있겠거니 하고.
  • jws 는 JWS(json web signature)와 JWE(json web encryption)로 서명과 암호화 한 것.

jwt 구조

  • 3가지 파트로 나뉘며 각 파트는 .(점) 으로 구분이 된다.
    • Header, Payload, Signature 로 구성된다.
    • ex. aaa.bbb.ccc
  • Header
    • 2가지 정보를 지닌다.
      • alg : 암호화(해싱) 알고리즘 명시
        • HS256(HMAC SHA-256), HS512, RS256(RSASSA SHA-256), ES256 등
      • typ : 토큰 타입을 명시
  • Payload
    • 토큰에 넣을 정보가 들어있다. key-value의 한 쌍으로 이루어진 클레임(claim)으로 불리는 것들로 이루어져있다.
    • 저장되는 정보에 따라 등록된 클레임, 공개 클레임, 비공개 클레임으로 구분됨.
  • Signature
    • 시그니처의 구조는 헤더 + 페이로드 와 서버가 가지고 있는 유일한 키 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화 한다.
      • 변조가 되었는지 확인하는 역할
    • signature = Base64Url(Header) + . + Base64Url(PayLoad) + server’s key

JWT 정보 확인하기

  • https://jwt.io/ 를 통해서 확인해보자
  • 예시의 데이터는 아래와 같다
    • secret key 로 test-secret-key 를 사용하였다.
// Encoded 된 데이터
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.JCNAMz0AsT31lKxaGO4R8n9PpZ6ry9ZkWUcS5e3OtP4

// Decoded 된 데이터
// HEADER:ALGORITHM & TOKEN TYPE
{
  "alg": "HS256",
  "typ": "JWT"
}

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

// VERIFY SIGNATURE
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  "test-secret-key"
)

// HEADER 데이터는 {"alg":"HS256","typ":"JWT"} 를 https://www.base64encode.org/ 에서 BASE64 Encode하면 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 나오는 것을 볼수 있을 것이다. 

// 마찬가지로 PAYLOAD 의 데이터인 {"sub":"1234567890","name":"John Doe","iat":1516239022} 를 BASE64 로 Encode 하면 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 를 볼 수 있을 것이다. 

// 마지막으로 서명 부분을 확인해 보자.
// 위에서 header 와 payload 를 BASE64 인코딩한 데이터가 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 인데 이 데이터를 헤더에 명시한 alg 인 HS256으로 해시하면 된다.
// https://www.devglan.com/online-tools/hmac-sha256-online 이 사이트나 https://www.javainuse.com/hmac 에서 Secret Key 로 test-secret-key 를 넣고 Base64 포맷으로 Hash 하면 
// JCNAMz0AsT31lKxaGO4R8n9PpZ6ry9ZkWUcS5e3OtP4= 이 나오는 것을 볼 수 있을 것이다. 

참고

  • https://velog.io/@egoavara/series/JWK-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%A0%9C%EC%9E%91%EA%B8%B0
  • RFC7519
    • https://datatracker.ietf.org/doc/html/rfc7519
  • RFC7515
    • https://datatracker.ietf.org/doc/html/rfc7515
  • RFC7516
    • https://datatracker.ietf.org/doc/html/rfc7516
  • https://www.devglan.com/online-tools/hmac-sha256-online
  • https://www.javainuse.com/hmac

Tags:

Categories:

Updated: