220709_TIL : JWT

백승한·2022년 7월 9일
0

로그인 처리 과정

  • Controller 에서 "로그인된 회원 정보 (UserDetailsImpl)" 사용하는 방법
@Controller
public class TestController {
    @GetMapping("/")
    public String test(@AuthenticationPrincipal UserDetailsImpl userDetails) {
		}
}

설정 가격 변경 부분 - 현업이라면 UserDetailsImpl를 가져온 다음에 이 id로 이 상품이 실제 이 로그인한 사용자의 것인지 확인한 다음에 업데이트를 할것같다

secret key 를 통해서 암호화가 되고 복호화가 된다.
인증에 대한 처리를 해준다.

JWT 로그인 구현하기

  • JWT란?
    WT(Json Web Token)는 웹표준 (RFC 7519)으로
    JSON 포맷을 이용해 정보를 가볍고 안전하게 전송하기 위한 Claim 기반의 Web Token.
  • 서버가 1대인 경우

    • Session1 이 모든 Client 의 로그인 정보 소유
  • 서버가 2대 이상인 경우

    • 서버의 대용량 트래픽 처리를 위해 서버 2대 이상 운영 필요
  • Session 마다 다른 Client 로그인 정보를 가지고 있을 수 있음

    • Session1: Client1, Client2, Client3
    • Session2: Client4
    • Session3: Client5, Client6
  • Client 1 로그인 정보를 가지고 있지 않은 Sever2 나 Server3 에 API 요청을 하게되면 어떻하지?

    • 해결방법

      1) Sticky Session: Client 마다 요청 Server 고정

      2) 세션 저장소 생성

  • 세션 저장소 저장

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

    • 로그인 정보를 Server 에 저장하지 않고, Client 에 로그인정보를 JWT 로 암호화하여 저장 → JWT 통해 인증/인가
  • 모든 서버에서 동일한 Secret Key 소유

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

  • JWT 장/단점

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

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

    • HEADER: 사용한 알고리즘의 종류
    • PAYLOAD: 토큰에 담기는 데이터
    • VERIFY SIGNATURE: 점(.)을 구분자로 해서 헤더와 페이로드를 합친 문자열을 서명한 값이다. 헤더에 정의된 알고리즘과 비밀 키를 이용해 생성하고 Base64 URL-Safe로 인코딩한다.
  • JWT 사용 흐름

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

      • 로그인 정보 → JWT 로 암호화 (Secret Key 사용)
      • JWT 를 Client 응답에 전달
      • Client 에서 JWT 저장 (쿠키, Local storage 등)
    • 2) Client 에서 JWT 통해 인증하는 방법

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

      • Content-Type: application/json

      • Authorization: Bearer

      • Server에서 Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용) / JWT 유효기간이 지나지 않았는지 검증

      • 검증 성공시, JWT → "로그인 정보" (UserDetailsImpl) 만들어 사용

  • JWT 로그인 이해
    • 1) JWTAuthFilter: API 요청 Header에 전달되는 JWT 유효성 인증
      • 모든 API에 대해 JWTAuthFilter가 JWT 확인
      • 로그인 전 허용이 필요한 API는 예외처리 필요 -> FilterSkipMatcher
    • 2) FormLoginFilter: 회원 폼 로그인 요청 시 username / password 인증

추후에 스프링 시큐리티에 대해 자세히 뜯어봐야하는 블로그 기록 1
추후에 스프링 시큐리티에 대해 자세히 뜯어봐야하는 블로그 기록 2 - 더 중요

profile
방문해주셔서 감사합니다🙂

0개의 댓글