[항해99] Spring 숙련 (JWT 로그인 API 구현)
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);
}