JWT 로그인

송영재·2022년 10월 23일

Spring

목록 보기
19/45
  • 36) JWT 란?

    • 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. 세션 저장소 생성

        • Session storage 가 모든 Client 의 로그인 정보 소유
      4. JWT 사용

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

      • 모든 서버에서 동일한 Secret Key 소유

      • Secret Key 통한 암호화 / 위조 검증 (복호화 시)

      • JWT 장/단점

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

      1. Client 가 username, password 로 로그인 성공 시

        1. "로그인 정보" → JWT 로 암호화 (Secret Key 사용)

          Sample

        2. JWT 를 Client 응답에 전달

        3. Client 에서 JWT 저장 (쿠키, Local storage 등)

      2. Client 에서 JWT 통해 인증방법

        1. JWT 를 API 요청 시마다 Header 에 포함

          예) HTTP Headers

          Content-Type: application/json
          **Authorization: Bearer** **<JWT>
          ...**
        2. Server

          1. Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
          2. JWT 유효기간이 지나지 않았는지 검증
          3. 검증 성공시,
            1. JWT → "로그인 정보" (UserDetailsImpl) 만들어 사용

              ex) GET /api/products : JWT 보낸 사용자의 관심상품 목록 조회

    • JWT 구조

      • JWT 는 누구나 평문으로 복호화 가능

      • 하지만 Secret Key 가 없으면 JWT 수정 불가능

        → 결국 JWT 는 **Read only 데이터**

      1. Header

        {
          "alg": "HS256",
          "typ": "JWT"
        }
      2. Payload

        {
          "sub": "1234567890",
          "username": "제이홉",
          "admin": true
        }
      3. Signature

        HMACSHA256(
          base64UrlEncode(header) + "." +
          base64UrlEncode(payload),
          secret)
  • 37) JWT 로그인 이해

    1. JWTAuthFilter : API 요청 Header 에 전달되는 JWT 유효성 인증
      1. 모든 API 에 대해 JWTAuthFilter 가 JWT 확인
      2. 로그인 전 허용이 필요한 API 는 예외처리 필요 ⇒ FilterSkipMatcher
        1. ex) 로그인 폼 페이지, 로그인 처리, css 파일 등
    2. FormLoginFilter : 회원 폼 로그인 요청 시 username / password 인증
    • 인증 성공 시 응답 (Response) 에 JWT 포함 : JWT 전달방법은 개발자가 정함 예) 응답 Header 에 아래 형태로 JWT 전달
      **Authorization: BEARER** <JWT>
      
      ex)
      **Authorization: BEARER** eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzcGFydGEiLCJVU0VSTkFNRSI6IuultO2DhOydtCIsIlVTRVJfUk9MRSI6IlJPTEVfVVNFUiIsIkVYUCI6MTYxODU1Mzg5OH0.9WTrWxCWx3YvaKZG14khp21fjkU1VjZV4e9VEf05Hok

0개의 댓글