스프링 부트 - JWT의 개념

2024. 7. 31. 18:18스프링/스프링부트

2024/07/31


※  JWT의 개념에 대해 알아보자.



     ▶ JWT란?
        - Json Web Token의 약자로 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
          다시 말해, 토큰의 한 종류이다.


     ▶ 주로 어디에 저장할까?
        - 일반적으로 쿠키 저장소를 사용해 JWT 저장함


     ▶ JWT 왜 사용하는가? 

      ※ 로그인을 예시로 알아보자.

        - 서버가 2대 이상인 경우(대용량 트래픽 처리를 위해 2대 이상의 운영이 필요할 때)

그림[1] 2대 이상의 서버

 

  • 그림[1] 의 경우, 세션마다 다른 클라이언트 로그인 정보를 가질 수 있다.
       EX) Session1: Client1, Client2
              Session2: Client3 ...


  • 만약 Client1의 로그인 정보를 가지고 있지 않은 Sever2 나 Server3 에 API 요청을 하게되면 문제가 발생하지 않을까?
    ☞ Solution1) Sticky Session: Client 마다 요청 Server 고정
    ☞ Solution2) 세션 저장소 생성하여 모든 세션을 저장


    [그림2] Solution2의 방법
  •   Session storage 가 모든 Client의 로그인 정보 소유하고 있기 때문에 모든 서버에서 모든 Client의 API 요청을 처리할 수 있다.


 BUT, 위의 방법처럼 로그인 정보를 Server에 저장하지 않으려면?
       - 로그인 정보를 Server 에 저장하지 않고, Client 에 로그인 정보를 JWT 로 암호화하여 저장JWT 통해 인증/인가


[그림3] 모든 서버에서 동일한 Secrete Key 소유




그림[4] Secret Key 통한 암호화 / 위조 검증 (복호화 시)




 ▶ JWT 장단점

   1. 장점
      ●  동시 접속자가 많을 때 서버 측 부하 낮춤
      ●  Client, Sever 가 다른 도메인을 사용할 때
        예) 카카오 OAuth2 로그인 시 JWT Token 사용


   2.단점
        ● 구현의 복잡도 증가
        ●  JWT 에 담는 내용이 커질 수록 네트워크 비용 증가 (클라이언트 → 서버)
        ●  생성된 JWT 를 일부만 만료시킬 방법이 없음(BUT, 방법이 아예 없진 않음)
        ●  Secret key 유출 시 JWT 조작 가능




     ▶ JWT 사용 흐름(간략히)

       1. Client가 username, password 로 로그인 성공 시
          a. 서버에서 "로그인 정보" → JWT 로 암호화 (Secret Key 사용)
          b. 서버에서 직접 쿠키를 생성해 JWT를 담아 Client 응답에 전달(전달 방법은 개발자가 정함)
          c. 브라우저 쿠키 저장소에 자동으로 JWT 저장


       2. Client에서 JWT 통해 인증방법
          a. 서버에서 API 요청 시마다 쿠키에 포함된 JWT를 찾아서 사용
          b. Server
            - Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
            - JWT 유효기간이 지나지 않았는지 검증
            - 검증 성공시, JWT에서 사용자 정보를 가져와 확인




     ▶ JWT 구조

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

그림[5] Payload에 실제 유저의 정보가 들어있고, HEADER와 VERIFY SIGNATURE부분은 암호화 관련된 정보 양식이라고 생각하면 된다.







 

다음 시간에는 JWT를 다루는 법에 대해 알아보겠습니다.

 


※ 위 이미지들은 스파르타코딩클럽에 저작권이 있으므로 무단 도용 금지 및 상업 목적으로 사용할 수 없습니다.

'스프링 > 스프링부트' 카테고리의 다른 글

스프링 부트 - JWT 다루기  (0) 2024.08.06