JWT란 Json Web Token의 약자로 당사자간의 정보를 Json 형태로 전송하기 위한 표준입니다. (RFC7519)
JWT는 서명을 이용하여 신뢰할 수 있는 정보입니다. 보통 HMAC, RSA, ECDSA(타원곡선 암호)를 사용하여 서명합니다.
저는 보통 JWT를 이용하여 로그인 후 토큰을 발급하는 용도로 사용하였습니다. 따라서 무결성만 제공된다면 해당 사용자에게 맞는 권한의 서비스를 제공해줄 수 있습니다.
Json Web Token 구조
JWT는 Header, Payload, Signature
3가지 정보가 ‘ . ’으로 나누어져 있습니다.
xxxx.yyyy.zzzz
Header
헤더에는 보통 토큰의 유형, 서명에 사용되는 서명 알고리즘(RSA, HMAC SHA256 등..)의 두 부분으로 구성됩니다.
Header 예시
{
"alg":"HS256" (HMAC SHA256)
"typ":"JWT" (Token Type)
}
이 JSON은 Base64Url로 인코딩되어 JWT의 첫 번째 부분(xxxx)을 구성합니다.
Payload
페이로드에는 클레임(claims)이 저장되며 클레임에는 엔티티에 대한 설명이 저장됩니다.
Claim은 세가지 부분으로 나뉘며 Registered claims, Public claims, Private claims 세부분으로 나뉩니다.
- Registered claims : 보통 iss(발행자), exp(토큰 만료시간), sub(subject), aud(audience) 등을 포함합니다.
- Public claims : JWT를 사용하는 사람들이 원하는대로 정의할 수 있습니다.
- Private claims : 당사자들 간의 정보를 공유하기 위해 생성된 맞춤 클레임
모든 클레임의 정의는 https://www.iana.org/assignments/jwt/jwt.xhtml에 있습니다.
Payload 예시
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Header와 마찬가지로 Base64Url로 인코딩되어 JWT의 두 번째 부분(yyyy)를 구성합니다.
Signature
서명부분은 앞에서 만든 인코딩된 헤더, 페이로드를 합치고Secret Key를 이용하여 서명 알고리즘을 통해 서명값을 생성합니다.
만약 HMAC SHA256으로 서명을 한다면 다음과 같이 서명값을 생성합니다.
HMACSHA256(
Base64UrlEncode() + "." +
Base64UrlEncode(),
Secret Key
)
HMAC SHA256에 대해서 자세한 사항은 https://en.wikipedia.org/wiki/HMAC를 참고해주세요
HMAC SHA256으로 암호화된 서명은 SHA256을 이용하여 단방향성을 띄고있어 복호화는 불가능하다.
따라서 로그인 작업 후 서버에서 Secret Key로 서명값을 생성한 JWT를 발급하고 모든 요청에대해서 JWT로 인가처리를 진행한다면 해당 Signature가 검증된 유저에게만 요청을 허락해준다.
즉, Base64Url 인코딩된 헤더와 페이로드 값을 서버가 가지고있는 SecretKey로 HMAC SHA256으로 서명한다면 서버외에는 누구도 서명값을 생성하지 못한다.
JWT는 매우 작은 크기로 컴팩트하게 사용할 수 있기 때문에 JWT를 웹 보안에 많이 사용합니다.
일반적으로 Bearer 스키마를 사용하여 Authorization헤더에 담아 JWT를 보냅니다.
Authorization : Bearer <token>
JWT는 https://jwt.io/에서 생성해볼 수 있고 검증도 해볼 수 있습니다.
'웹' 카테고리의 다른 글
Image 데이터를 RestTemplate로 통신하면서 발생한 에러 (0) | 2023.11.13 |
---|---|
Spring Cloud Eureka란? (0) | 2023.10.30 |
Spring Boot에서 보안을 위한 JWT를 발급하는 방법 (0) | 2023.10.27 |
Spring Boot 이미지 받는 방법 (0) | 2023.09.18 |
Spring Boot를 이용하여 MSA 구조 구현의 어려웠던 점 (0) | 2023.09.05 |