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의 장점
- 자체 포함(self-contained) JWT는 필요한 모든 정보를 자체적으로 포함하고 있어 별도의 데이터베이스 조회가 필요하지 않습니다.
- 가벼움 JSON 포맷을 사용하여 가볍고, URL로 안전하게 전송할 수 있습니다.
- 확장성 클레임을 통해 필요한 정보를 쉽게 추가하고 확장할 수 있습니다.
JWT 사용 시 고려사항
- 보안 JWT는 기본적으로 서명만 되어 있으며, 페이로드는 인코딩되어 있지만 암호화되지 않았습니다. 따라서 민감한 정보를 페이로드에 포함시키지 않도록 해야 합니다.
- 만료 관리 exp 클레임을 사용하여 JWT의 유효 기간을 설정하고 만료된 토큰을 사용하지 않도록 해야 합니다.
- 비밀 키 관리 서명에 사용되는 비밀 키는 안전하게 관리하고 외부에 노출되지 않도록 해야 합니다.
- 적절한 알고리즘 사용 알고리즘 선택 시 보안 수준을 고려하여 적절한 알고리즘을 사용해야 합니다 (예: 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 |