cs

[cs] J W T(Json Web Token)

엄지성 2024. 10. 21. 01:02

토큰 관련된 인증은 대부분 로그인과 관련되어 사용합니다.

그중 JWT는 웹 표준을 따르고 있고, JSON 객체를 사용해 정보를 전달합니다.

 

JWT의 장점이라고 하자면 토큰 안에 정보를 담아 전달하기 때문에 JWT로 인증이 가능하다는 점입니다.

또한, 웹 표준을 따르기 때문에 언어 대부분이 JWT를 지원합니다.

 

JWT 구조

JWT 구조

 

위 사진과 같이 헤더, 페이로드, 서명으로 이루어져 있습니다. 이것을 "."으로 구분합니다.

 

헤더에는 JWT 타입과 어떤 해싱 알고리즘을 사용했는지 명시합니다.

페이로드는 Claim이 들어갑니다. 여기서 Claim은 3가지 종류가 있습니다. 3가지 종류로는 registered, public, private가 있습니다.

서명은 JWT 토큰의 무결성을 보장하기 위해 헤더와 페이로드를 해싱한 후 비밀키로 서명한 값이 들어갑니다.

 

 

JSON이란?

Json은 Key, Value가 한 쌍을 이루는 객체입니다.

{
    "employees":[
        {"firstName":"John", "lastName":"Doe"},
        {"firstName":"Anna", "lastName":"Smith"},
        {"firstName":"Peter", "lastName":"Jones"}
    ]
}

 

 

HEADER

인코딩: Base64

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

헤더는 해시 알고리즘과 타입을 정할 수 있습니다.

HS256는 HMAC SHA 256을 의미합니다. 이것은 해시 알고리즘 중 하나입니다.

그리고 타입의 값으로 입력한 JWT는 이 토큰을 JWT로 지정한다는 뜻입니다.

PAYLOAD

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

페이로드에는 전달하고자 하는 데이터를 포함합니다.

데이터의 각각의 Key를 Claim이라고 부릅니다. 클레임은 사용자가 원하는 Key와 Value로 커스텀할 수 있습니다.

클레임의 3가지 종류를 설명하겠습니다.

 

registered claim: 등록된 클레임

간단하게 3글자로 정의하고 필수는 아니지만 사용을 권장하는 클레임입니다.

issuer(iss), expiration(exp), subject(sub), audience(aud) 등이 있습니다.

다른 클레임이 궁금하시나요?

https://datatracker.ietf.org/doc/html/rfc7519#section-4.1

 

public claim: 공개 클레임

사용자가 자유롭게 정의할 수 있는 클레임입니다.

하지만 충돌을 방지하기 위해서는 IANA JSON 웹 토큰 레지스트리에 정의돼 있거나 충돌이 방지된 네임스페이스를 포함하는 URI로 정의하여야 됩니다.

{"http(s)://specific.uri/@unique_recommended_namespace/additional_path": true}

 

IANA JSON Web Token Registries: https://www.iana.org/assignments/jwt/jwt.xhtml

 

JSON Web Token (JWT)

birth_middle_name Middle name(s) someone has when they were born, or at least from the time they were a child. This term can be used by a person who changes the middle name later in life for any reason. Note that in some cultures, people can have multiple

www.iana.org

 

private claim: 비공개 클레임

등록된 또는 공개 클레임이 아닌 클레임이며, 정보를 공유하기 위해 만들어진 커스터마이징 된 클레임입니다.

 

precautions: 주의사항

페이로드는 서명된 파트가 아니라 단순하게 Base64로 인코딩 된 파트이기 때문에 토큰을 디코딩하여서 데이터를 열람가능합니다.

그래서 페이로드는 password, 주민번호, 전화번호 등 중요하거나 개인정보같은 경우는 페이로드에 담으면 안 됩니다.

 

SIGNATURE

해시: HS256

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

 

서명 파트는 Base64로 인코딩 된 헤더. 페이로드 And secret이 필요합니다. 여기서 secret은 유저가 지정해서 사용하는 비밀코드입니다.

이런 식으로 하면 해싱하면 서명이 완성되어 JWT 토큰이 완성됩니다.

'cs' 카테고리의 다른 글

[cs] 싱글톤의 장점과 단점  (0) 2024.09.23
[cs] Proxy란  (0) 2024.09.01
[cs] HTTP? HTTPS?  (0) 2024.06.02
[cs]토폴로지(topology)란?  (0) 2024.05.17