항해99 개발일지

[항해99] Spring 숙련 (JWT 로그인 API 구현)

펭귄코기 2022. 10. 9. 00:36

JWT (JSON Web Tokens)란?

서버가 1대인 경우

Session1 이 모든 클라이언트의 로그인 정보를 소유한다

 

서버가 2대 이상인 경우

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

 

Session 마다 다른 클라이언트 로그인 정보를 가지고 있을 수 있음

 

해당 로그인 정보가 없는 서버에 요청시를 해결하기 위해

 

세션 저장소 생성

Session Storage가 모든 클라이언트 로그인 정보 소유

 

JWT 사용

로그인 정보를 Server에 저장하지 않고

클라이언트에 로그인 정보를 JWT로 암호화하여 저장 ㅡ> JWT 통해 인증/인가

 

모든 서버에서 동일한 시크릿키를 소유한다

 

시크릿키를 통한 암호화 / 위조검증 을 한다

 

JWT 장점

동시 접속자가 많을때 서버 측 부하 낮춤

클라이언트, 서버가 다른 도메인을 사용할 때 OAUTH 같은거

 

JWT 단점

구현의 복잡도 증가

JWT에 담는 내용이 커질 수록 네트워크 비용 증가

기생성된 JWT를 일부만 만료시킬 방법이 없음

시크릿키 유출 시 JWT 조작 가능

 

JWT 사용 흐름

1. 클라이언트가 username, password 로 로그인 성공 시

로그인정보 ㅡ> JWT로 암호화 (시크릿키 사용)

JWT를 클라이언트 응답에 전달

클라이언트에서 JWT 저장 (쿠키, Loval storage 등)

 

2. 클라이언트에서 JWT 통해 인증방법

JWT를 API 요청시 마다 헤더에 포함한다

서버에서 클라이언트가 전달한 JWT 위조 여부 검증한다 (시크릿키 사용)

JWT 유효기간이 지나지 않았는지 검증한다

검증 성공시 JWT ㅡ> 로그인정보 (UserDetailsImpl) 만들어 사용한다

 

JWT 구조

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

하지만 시크릿키 없으면 JWT 수정 불가능

결국 JWT는 Read Only데이터

 

JWT 로그인 이해

 

JWTAuthFilter

API 요청 Header에 전달되는 JWT 유효성 인증

 

모든 API에 대해 JWTAuthFilter가 JWT 확인 한다

로그인 전 허용이 필요한 API는 예외처리 필요 ㅡ> FilterSkipMatcher

ex) 로그인 폼 페이지, 로그인 처리, css 파일 등

 

JWT 인증 구성

JWT 로그인 인증 전처리 및 요청 (Filter)

Filter는 클라이언트의 API 요청이 컨트롤러에 전달되기 전 사전 처리를 하는 영역

즉 컨트롤러에 도달하기 전에 인증 처리를 하기 위해 사용한다

 

인증 처리 (Provider)

Filter가 인증에 필요한 정보를 적합한 클래스 형태로 만들어

Spring Security에 인증 요청을 한다

 

Spring Security 는 Filter 가 요청한 인증 처리를 할 수 있는 Provider 를 찾고

실제 인증처리는 Provider 에 의해 진행된다

 

인증처리 가능 여부 판단기준

supports 함수 통해 "인증정보의 클래스 타입"을 보고 판단

@Override
public boolean supports(Class<?> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
}