1. JWT
- JSON 형식의 토큰 표준입니다. (RFC 7519)
- URL의 일부 혹은 HTTP 헤더에 포함시켜 토큰을 전달합니다.
특징
경량성
- 간결하고 크기가 작음
- 제약된 환경에서 정보를 간단하게 전달하는데 사용됨
보안성
- 서명된 토큰
- 무결성 보장: 정보가 위조되지 않았음을 검증할 수 있음
- Algorithm: HMAC, RSA
- 데이터 암호화 가능 (민감데이터 보호)
자급자족
- 필요한 정보를 자체적으로 포함하고 있음
- 서버측에서 별도의 상태를 유지할 필요가 없음
- 서버는 토큰의 클레임 정보를 통해 별도의 데이터베이스 조회 없이 요청을 처리할 수 있음
2. 구성
{
{
"alg": "HS256",
"typ": "JWT"
},
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
}
header
- 토큰의 메타데이터
alg
- 서명할 떄 사용한 알고리즘
- HS256: HMAC using SHA-256 (대칭키)
- RS256: RSASSA-PKCS1-v1_5 using SHA-256 (비대칭키)
- ES256: ECDSA using SHA-256 and P-256 (비대칭키)
typ
- 토큰의 타입
- JWT 사용시, "JWT"로 설정됨
payload
- 토큰에서 포함된 정보 조각
claim
- 데이터 쌍 (토큰 발행자, 만료 시간, 주제, 사용자 권한 등)
- Registered Claims: 정의된 클레임 (JWT 스펙 정의 O)(iss, exp, sub, aud)
- Public Claims: 정의된 클레임 (JWT 스펙 정의 X)
- Private Claims: 사용자 정의 클레임 (JWT 스펙 정의 X)
signature
- 토큰의 서명 정보
- JWS를 사용하여 서명 (서명을 생성하기 위해 사용하는 기술)
무결성 보장
- 전송 중 변경되지 않았음을 보장함
- 수신자는 서명을 검증하여 위조 여부 확인 가능
서명 과정
- 헤더 & 페이로드 인코딩 (Base64Url)
- 서명: 인코딩된 헤더와 페이로드 조합 + 서명 알고리즘(비밀키 사용)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
4. 인코딩
{Base64Url(Header)}.{Base64Url(Payload)}.{Base64Url(Signature)}
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. // header
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9. // payload
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ // signature
- Header, Payload, Signature를 Base64로 표현한 값
5. 검증 과정
토큰 수신
토큰 분해
- 인코딩된 토큰을 Header, Payload, Signature 세 부분으로 나눕니다
헤더 확인
- Header를 Base64Url 디코딩하여 읽음
서명 검증
- 서버는 자신이 가지고 있는 비밀키를 사용하여 HMACSHA256 해시를 생성합니다. (Header와 Payload의 조합)
- 이 해시값은 위의 Signature 값과 동일해야 무결하다 판단합니다.
클레임 검증
- Payload를 Base64Url 디코딩하여 읽음
- exp 클레임: 토큰 만료 여부
- role 클레임: 요청에 대한 인가 권한 적절성
- sub, name 등의 클레임도 필요에 따라 검증될 수 있습니다.
결과 확인
- 서명과 모든 클레임이 올바르다면 JWT는 유효하다 판단합니다.
- 그렇지 않은 경우, JWT는 무효로 간주되어 시스템에서 거부됩니다.
참고
'Spring > Spring Security' 카테고리의 다른 글
[Spring Security][KoLiving] 4. JWT 토큰 기반 인증 (0) | 2023.10.03 |
---|---|
[JWT] 2. AccessToken과 RefreshToken (0) | 2023.10.03 |
[Spring Security] 3-4. 인증: 로그아웃 (0) | 2023.10.03 |
[Spring Security] 3-3. 인증: 패스워드 저장소 (0) | 2023.10.02 |
[Spring Security] 3-2. 인증: 아이디 / 패스워드 (2) | 2023.10.02 |