JWT(Json Web Token)
- 웹 기반 환경에서 정보를 안전하게 전송하기 위해 설계된 토큰 기반 인증 방식
- 클라이언트와 서버 간에 JSON 객체로 정보를 안전하게 전달 할 수 있도록 고완된 토큰이다
- 토큰 자체에 필요한 정보(토큰 만료시간, 유저 정보 등)를 모두 가지고 있어 별도의 데이터 베이스나 세션 상태를 유지할 필요가 없다(State less의 특징을 살릴 수 있다)
JWT Token의 구조
- Header : 토큰의 타입과 서명 알고리즘의 정보를 가지고 있음
{ "alg": "HS256", "typ": "JWT" }
- Payload : 토큰에 담을 Claim들이 포함될 부분
Claim : 토큰에 담길 정보를 의미함, 사용자에 대한 정보, 권한, 토큰 유효 시간 등
{
"sub": "user123",
"name": "John Doe",
"role": "user"
}
이 예시에서 "sub"는 토큰에 관한 주제(subject) 정보를 나타내며, "name"은 사용자 이름, "role"은 사용자 역할 등을 의미합니다. 클레임은 등록된 클레임(Registered Claims)과 사용자 정의 클레임(Custom Claims)으로 구분된다.
- Sinnature(서명) : 토큰의 무결성을 보장하기 위해 토큰을 성명한 값 : 성명은 헤더와 페리로드를 인코딩하고, 비밀키를 사용하여 서명한 뒤, 토크의 무결성을 검증
JWT의 흐름
- 클라이언트가 로그인을 성공하면, 서버에서 JWT를 생성하여 클라이언트에게 전달.
- 클라이언트는 JWT를 저장하고, 요청 시 Authorization 헤더나 쿠키 등에 포함하여 서버로 전송.
- 서버는 받은 JWT를 검증하고, 토큰에 담긴 정보를 확인하여 해당 클라이언트의 인증과 권한을 처리.
- 서버는 클라이언트에게 필요한 데이터를 반환하거나 요청을 처리.
JWT의 이점
- JWT는 세션이나 쿠키를 사용하지 않기 때문에 상태를 유지할 필요가 없으며, 서버의 부하를 줄일 수 있다.
- 또한, 정보가 암호화되어 있기 때문에 정보의 안전성을 보장한다.
- 하지만 반드시 필요한 정보 외에는 포함하지 않는 것이 중요하며, JWT의 만료 시간을 적절히 설정하여 보안을 강화해야한다.
JWT 검증 과정
- 토큰의 헤더와 페이로드를 Base64 디코딩하여 원본 JSON 객체를 얻는다.
- 원본 JSON 객체와 비밀 키를 사용하여 토큰의 서명을 검증한다.
- 서명이 유효하다면, 페이로드에서 클레임을 추출하여 해당 클레임의 값을 사용한다.
- 성명이 유효하지 않다면 토큰이 변경되었거나, 위변조 된 것으로 간주되며, 이를 무효화한다.
'JAVA > Spring' 카테고리의 다른 글
[스프링 학습] 1. 오브젝트와 IoC (0) | 2023.10.23 |
---|---|
Spring Template - RestTemplate (0) | 2023.07.23 |
Spring Template이란? (0) | 2023.07.23 |
HttpServletRequest와 @RequestBody (0) | 2023.07.23 |
01. Spring - DI(Dependency Injection) (0) | 2023.07.13 |