JWT(JSON Web Token)이란?
설명 (공식 홈페이지)
- JWT(JSON Web Token)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준(RFC 7519)입니다.
- 이 정보는 디지털 서명되어 있으므로 확인하고 신뢰할 수 있습니다.
- JWT는 비밀(HMAC 알고리즘 사용) 또는 공개로 사용하여 서명할 수 있습니다.
=> 즉 데이터를 디지털 서명하여 JSON 개체로 정보를 전송하는 표준 방법
✅ 디지털 서명시 데이터의 위변조를 확인할 수 있다.
✅ DB 쿼리를 줄일 수 있다.
토큰 작동 방법
1. JWT 토큰 얻기
애플리케이션 또는 클라이언트는 권한 부여를 요청한다.
⬇️
인증 서버에서 JWT 토큰을 얻는다.
2. JWT 토큰으로 인증하기
Http 요청의 Authorization 헤더에 JWT를 전송한다.
Authorization: Bearer <token>
⬇️
서버는 유효한 JWT인지 확인한다.
⬇️
허가시 사용자는 자원에 접근가능하다.
✅ 위 방법을 이용하면 인증시마다 인증 서버에 요청하지 않아도 된다! 요청시 서버에 유효한 토큰만 보내면 인증할 수 있다. ✨
JWT 구조
Header, Payload, Signature(서명)이 . 으로 구분되어있다.
~~~~헤더~~~~.~~~~~~페이로드~~~~~~~.~~~~서명~~~~~
Header
{
"alg": "HS256", // 서명 알고리즘
"typ": "JWT" // 토큰 유형
}
헤더는 Base64Url로 인코딩된다.
Payload
클레임(claim)을 포함한다.
🔵 클레임 : entity(사용자) 및 추가 데이터
등록된 클레임
권장되는 미리 정의된 클레임 집합
ex) iss(발급자), exp(만료 시간), sub(주제), aud(청중)
공개 클레임
마음대로 정의가능한 클레임
❕ 충돌을 방지하려면 IANA JSON 웹 토큰 레지스트리에 정의하거나, 충돌 방지 네임스페이스를 포함하는 URI로 정의해야한다.
예시
{
"https://example.com/path/resource.txt": true // 이름을 URI 방식으로 짓기
}
개인 클레임
사용에 동의한 당사자 간에 정보를 공유하기 위해 생성된 맞춤형 클레임
페이로드 예시
{
"sub": "1234567890", // 주제 (등록 클레임)
"name": "John Doe", // 비공개 클레임
"admin": true // 비공개 클레임
}
페이로드는 Base64Url로 인코딩된다.
Signature
서명 부분을 생성하려면 인코딩된 헤더, 인코딩된 페이로드, secret(비밀), 헤더에 지정된 알고리즘을 가져와서 서명해야 한다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
✅ 무결성 보장
✅ 개인키로 서명된 경우 발신자 확인 가능
참고 링크
'Spring > Spring 개발 상식' 카테고리의 다른 글
DB : 기본키, 외래키, 제약조건 (1) | 2023.07.06 |
---|---|
Mock test : @AutoConfigureMockMvc, MockMvc, JsonPath (0) | 2023.07.05 |
@Controller, @RestController, @ResponseEntity (0) | 2023.07.05 |
REST API 설계 (0) | 2023.06.26 |
IaaS vs PaaS vs SaaS (0) | 2023.06.26 |