JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다.
JWT는 보통 Spring Security와 같이 사용한다.
Spring Security와 JWT 구현에 대한 내용은 아래 포스팅을 확인하기 바란다.
Spring Security 개념 및 Architecture
Spring Security + JWT 인증 (1/2) - JWT 구현
Spring Security + JWT 인증 (2/2) - Spring Security 설정
전통적인 세션 인증 방식의 경우에는 Stateful 방식이다. 즉, 서버에서 세션에 대한 상태를 알고 있다는 뜻이다.
그렇기에 매 요청마다 서버와 통신을 해야 했고, 이는 곧 많은 트래픽 앞에서 서버 부하의 원인이 되기도 한다.
JWT는 이러한 문제점들을 해결하기 위해 등장했고 Stateless인 것이 특징이다.
토큰 안에 미리 인증에 필요한 정보들을 넣어둠으로써 매 요청마다 서버와 통신을 할 필요가 없게 되었다.
이로 인해 서버 부하와 같은 문제점들을 해결할 수 있게 되었다.
Header, Payload, Signature의 3 부분으로 이루어지며, Json 형태인 각 부분은 Base64로 인코딩 되어 표현된다. 또한 각각의 부분을 이어 주기 위해. 구분자를 사용하여 구분한다.
JWT 정보 확인하기
Header(헤더)
Payload (페이로드)
토큰의 페이로드에는 토큰에서 사용할 정보의 조각들인 클레임(Claim)이 담겨 있다.
Json(Key/Value) 형태로 다수의 정보를 넣을 수 있다.
클레임은 저장되는 정보에 따라 등록된 클레임(Registered Claims), 공개 클레임(Public Claims), 비공개 클레임(Private Cliams)로 구분된다.
등록된 클레임 (Registered Claim)
공개 클레임 (public claims)
충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓습니다.
{
"https://fvor001.tistory.com": true
}
비공개 클레임 (private claims)
통신을 주고받는 당사자들끼리 협의해서 자유롭게 키와 값을 정할 수 있다.
Signature(서명)
Header(헤더) 에서 정의한 알고리즘 방식(alg)을 활용한다.
Header와 Palyoad를 Base64로 인코딩한 값과 서버의 Secret Key를 Header에서 정의한 알고리즘으로 암호화한 값이다.
가장 중요한 것은 Secret Key이다.
Header와 Payload는 단순히 인코딩 된 값이기 때문에 제 3자가 Decode 하여 및 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.
따라서, Signature는 토큰의 위변조 여부를 확인하는데 사용된다.
1. 클라이언트에서 서버로 ID/PW로 로그인을 요청한다.
2. 서버에서 검증 과정을 거쳐 해당 유저가 존재하면, Access Token + Refresh Token을 발급한다.
3. 클라이언트는 요청 헤더에 2번에서 발급받은 Access Token 을 포함하여 API를 요청한다.
4. 클라이언트에서 보낸 Access Token의 만료시간이 지났다면, Access Token이 만료 되었다는 응답을 전달
5. 만료 응답을 받은 클라이언트는 Access Token을 재발급 받기위해 저장 공간에 저장해두었던, Refresh Token을 서버에 전달
6. 서버에서 Refresh Token 검증 후 Access Token과 Refresh Token을 클라이언트에 전달
인증된 사용자가 특정 리소스에 접근할 때 사용되는 토큰
Access Token의 갱신을 위해 사용되는 토큰
Refresh Token Rotation의 약자로 Refresh Token을 단 한 번만 사용할 수 있도록 하는 것이다.
Spring Security - FilterSecurityInterceptor 이해 및 Example (2) | 2024.11.11 |
---|---|
Spring Security + JWT 인증 (2/2) - Spring Security 설정 (29) | 2024.08.21 |
Spring Security + JWT 인증 (1/2) - JWT 구현 (25) | 2024.08.20 |
Spring Security 개념 및 Architecture (28) | 2024.08.19 |
[Spring] Filter Example (36) | 2024.08.14 |
댓글 영역