일단 진행시켜

[개념]:💡JWT에 대해 알아보자 본문

🌿Spring, SpringBoot

[개념]:💡JWT에 대해 알아보자

2024. 9. 29. 20:47

 

1. JWT 개요

JSON 웹 토큰인 JWT는 상태 비저장 인증 메커니즘이다.

상태 비저장? → 서버가 토큰 발행 후 사용자 세션을 추적하지 않음을 의미!

서버가 토큰을 생성하여 클라이언트에 전송하면 클라이언트는 이를 저장하고 후속 요청을 인증하는 데 사용하는 일을 담당한다.

 

 

1.1. JWT 구성 요소

  • 헤더: 서명 알고리즘, 토큰 유형을 포함
  • 페이로드: 사용자 정보, 역할, 만료 기간과 같은 클레임을 포함
  • 서명: 토큰이 유효하고 변조되지 않았는지 확인

 

1.2. 클라이언트의 JWT?

  • 서버는 사용자를 인증(로그인) 한 후 JWT를 생성하여 클라이언트에게 다시 보낸다
  • 클라이언트는 받은 JWT를 다음 위치에 저장한다
    1. 로컬 저장소: 로컬 스토리지
    2. 세션 저장소
    3. 쿠키: HTTP 전용 및 보안
  • 클라이언트가 나중에 서버에 요청을 할 때 즉, 보호된 리소스에 액세스 요청할 때 요청 헤더에 Authorization: Bearer로 이 JWT를 포함한다

 

1.3. 서버의 JWT?

  • 클라이언트가 요청으로 JWT를 보내면 서버는 크게 3가지 기능을 수행한다.
  1. JWT 디코딩
    • 토큰을 추출하고 비밀 키를 사용하여 서명의 유효성을 검사한다
    • 사용자 ID, 만료 시간 등 클레임을 확인한다
  2. 토큰 만료 확인
  3. 사용자 확인
    • 유효한 토큰일 경우 서버는 클레임에서 사용자를 식별하고 보호된 리소스에 대한 액세스를 허용한다

 

 


2. 로그아웃?

2.1. 상태 비저장 토큰의 한계점

JWT는 상태 비저장 토큰이다. 토큰 발급 후에 서버가 토큰을 추적하지 않는다.

결과적으로 JWT를 통한 로그아웃에는 아래와 같은 문제가 발생한다.

  1. 서버는 이미 발급된 토큰을 무효화할 수 없다.
  2. 사용자가 로그아웃했어도 토큰은 여전히 유효하고, 다른 장치의 공격자나 사용자가 소유하고 있는 경우, 해당 토큰은 만료 기간까지 계속 유효한다.

따라서, JWT를 통한 로그아웃 기능을 구현할 때, 무효화 처리를 따로 해주어야 한다.

 

2.2. 블랙리스트

블랙리스트 처리를 통해 서버에서의 토큰 무효화를 구현할 수 있다.

  1. 사용자가 로그아웃하면 클라이언트는 로컬 저장소(or 쿠키)에서 토큰을 제거한다.
  2. 만일 토큰이 손상된 경우(다른 장치에 존재함) 계속 사용 가능함
  3. 이에 대응하기 위해 서버는 더 이상 유효하지 않은 토큰의 블랙리스트를 유지 관리 한다.

 

3. 전체적인 흐름

1. 로그인

  1. 클라이언트는 서버에 자격 증명을 전송
  2. 서버가 JWT를 생성
  3. 클라이언트는 이 JWT를 로컬(로컬 스토리지, 쿠키)에 저장

2. 요청

  1. 클라이언트는 ‘Authorization’ 헤더에 JWT를 전송
  2. 서버는 토큰을 확인하고 요청을 처리
  3. 블랙리스트에 등록된 토큰일 경우 요청을 거부

3. 로그아웃

  1. 클라이언트는 로컬에 JWT를 제거
  2. 서버는 JWT를 블랙리스트에 추가
  3. 블랙리스트에 등록된 토큰이 향후 요청될 경우 이를 거부할 수 있음

클라이언트는 JWT를 안전하게 저장하고 로그아웃 시 제거한다

서버는 JWT 서명/만료 여부를 확인한다

블랙리스트 처리를 통해 로그아웃 후 손상된 토큰이 사용되는 것을 방지하여 안전한 로그아웃을 보장할 수 있다.

 

 

 

'🌿Spring, SpringBoot' 카테고리의 다른 글

spring- 로그 출력 안되는 문제 해결  (1) 2024.01.07