본문 바로가기

Java/Spring

JWT

JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉 토큰의 한 종류이다. 보통 쿠키 저장소에 담긴다.

 

JWT의 사용 이유

1.서버가 1대인 경우

  • Session1 이 모든 Client 의 로그인 정보 소유

2.서버가 2대 이상인 경우

  • 서버의 대용량 트래픽 처리를 위해 서버 2대 이상 운영 필요

  • Session 마다 다른 Client 로그인 정보를 가지고 있을 수 있음
    • Session1: Client1, Client2, Client3
    • Session2: Client4
    • Session3: Client5, Client6
  • Client 1 로그인 정보를 가지고 있지 않은 Sever2 나 Server3 에 API 요청을 하게되면 어떻하지?
    • 해결방법
      1. Sticky Session: Client 마다 요청 Server 고정
      2. 세션 저장소 생성

3.JWT 사용

  • 로그인 정보를 Server 에 저장하지 않고, Client 에 로그인정보를 JWT 로 암호화하여 저장 → JWT 통해 인증/인가

  • 모든 서버에서 동일한 Secret Key 소유
  • Secret Key 통한 암호화 / 위조 검증 (복호화 시)

  • JWT 장/단점
    1. 장점
      • 동시 접속자가 많을 때 서버 측 부하 낮춤
      • Client, Sever 가 다른 도메인을 사용할 때
        • 예) 카카오 OAuth2 로그인 시 JWT Token 사용
    2. 단점
      • 구현의 복잡도 증가
      • JWT 에 담는 내용이 커질 수록 네트워크 비용 증가 (클라이언트 → 서버)
      • 기 생성된 JWT 를 일부만 만료시킬 방법이 없음
      • Secret key 유출 시 JWT 조작 가능

 

JWT 사용 흐름

  1. Client 가 username, password 로 로그인 성공 시
    1. "로그인 정보" → JWT 로 암호화 (Secret Key 사용)
    2. JWT 를 Client 응답에 전달
    3. Client 에서 JWT 저장 (쿠키, Local storage 등)
  2. Client 에서 JWT 통해 인증방법
    1. JWT 를 API 요청 시마다 Header 에 포함
    2. Server에서 Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
    3. JWT 유효기간이 지나지 않았는지 검증
    4. 검증 성공시, JWT에서 사용자 정보를 가져와 확인

 

  • JWT 는 누구나 평문으로 복호화 가능
  • 하지만 Secret Key 가 없으면 JWT 수정 불가능
  • 결국 JWT 는 Read only 데이터이다

'Java > Spring' 카테고리의 다른 글

Transaction  (0) 2022.12.28
인증과 인가  (0) 2022.12.14
의존성 주입 - 스프링 IoC컨테이너  (0) 2022.12.13
의존성 주입 - 강한결합  (0) 2022.12.13
영속성 컨텍스트  (0) 2022.12.12