본문 바로가기

API

[API Auth] JWT란 무엇인가?! (구성 요소 및 예시)

728x90
반응형


JWT (JSON Web Token)는 주로 인증 및 권한 부여를 위해 사용되는 압축된 JSON 객체입니다. JWT는 세 가지 주요 부분으로 구성되어 있으며, 각 부분은 점(.)으로 구분됩니다. 이 세 부분은 헤더(Header), 페이로드(Payload), 서명(Signature)입니다. 이제 각 부분을 자세히 살펴보겠습니다.

JWT의 구성 요소

헤더 (Header) 헤더는 두 가지 정보를 포함합니다:

  • 알고리즘(alg): 서명을 생성하는 데 사용된 해싱 알고리즘 (예: HS256, RS256).
  • 타입(typ): 토큰의 타입, JWT로 설정합니다.
{
  "alg": "HS256",
  "typ": "JWT"
}

페이로드 (Payload) 페이로드는 JWT의 본문 부분으로, 클레임(Claim)이라고 불리는 일련의 정보가 포함됩니다. 클레임은 다음과 같이 세 가지 유형이 있습니다:

      • 등록된 클레임(Registered Claims): 사전에 정의된 클레임 (예: iss(발행자), exp(만료시간), sub(주제), aud(청중)).
      • 공개 클레임(Public Claims): 충돌을 방지하기 위해 IANA JSON Web Token Registry에 등록되어야 하는 클레임.
      • 비공개 클레임(Private Claims): 발행자와 수신자 간에 동의한 클레임.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}

서명 (Signature) 서명은 헤더와 페이로드를 인코딩한 후 비밀 키를 사용하여 해싱하여 생성됩니다. 서명은 토큰의 무결성을 확인하는 데 사용됩니다. HMAC SHA256 알고리즘을 사용하는 경우, 서명은 다음과 같이 생성됩니다:

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

JWT 예시

위의 구성 요소를 결합하면 다음과 같은 JWT가 생성됩니다:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT의 장점

  1. 자체 포함(self-contained) JWT는 필요한 모든 정보를 자체적으로 포함하고 있어 별도의 데이터베이스 조회가 필요하지 않습니다.
  2. 가벼움 JSON 포맷을 사용하여 가볍고, URL로 안전하게 전송할 수 있습니다.
  3. 확장성 클레임을 통해 필요한 정보를 쉽게 추가하고 확장할 수 있습니다.

JWT 사용 시 고려사항

  1. 보안 JWT는 기본적으로 서명만 되어 있으며, 페이로드는 인코딩되어 있지만 암호화되지 않았습니다. 따라서 민감한 정보를 페이로드에 포함시키지 않도록 해야 합니다.
  2. 만료 관리 exp 클레임을 사용하여 JWT의 유효 기간을 설정하고 만료된 토큰을 사용하지 않도록 해야 합니다.
  3. 비밀 키 관리 서명에 사용되는 비밀 키는 안전하게 관리하고 외부에 노출되지 않도록 해야 합니다.
  4. 적절한 알고리즘 사용 알고리즘 선택 시 보안 수준을 고려하여 적절한 알고리즘을 사용해야 합니다 (예: HS256보다는 RS256 또는 ES256을 권장).

이러한 개념과 상세 구성을 이해하면 JWT를 활용하여 안전하고 효율적인 인증 및 권한 부여 시스템을 설계할 수 있습니다.

728x90
반응형

'API' 카테고리의 다른 글

[gRPC] gRPC란 무엇인가?  (0) 2024.07.08
HTTP3에 대해 알아보기!  (0) 2024.03.11
RPS와 TPS의 차이점 무엇일까?  (0) 2024.01.25
[부하테스트] Locust란 무엇인가?  (0) 2023.12.12
[API] REST API 보안  (0) 2019.01.15