JWT Token

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의 흐름

  1. 클라이언트가 로그인을 성공하면, 서버에서 JWT를 생성하여 클라이언트에게 전달.
  2. 클라이언트는 JWT를 저장하고, 요청 시 Authorization 헤더나 쿠키 등에 포함하여 서버로 전송.
  3. 서버는 받은 JWT를 검증하고, 토큰에 담긴 정보를 확인하여 해당 클라이언트의 인증과 권한을 처리.
  4. 서버는 클라이언트에게 필요한 데이터를 반환하거나 요청을 처리.

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