https://www.youtube.com/watch?v=NPRh2v7PTZg&list=PLJkjrxxiBSFCcOjy0AAVGNtIa08VLk1EJ
"개발자유미" 님의 스프링 시큐리티 JWT 시리즈를 보고 정리한 글입니다.
이전에 스프링 시큐리티 세션 방식에 이어서 JWT를 활용한 인증/인가 처리 방법에 대해서 공부하고 정리한 글입니다.
1. 회원 가입 : 세션 방식과 JWT 방식의 차이 없음

2. 로그인 (인증) : 세션 방식에서는 스프링 시큐리티가 알아서 자동으로 처리해주었는데, JWT 방식에서는 조금 더 복잡하게 설정을 해줘야한다.(ex. UsernamePasswordAuthenticationFilter)

3. 경로 접근(인가) : 로그인 후에 발급받은 토큰을 헤더에 넣은채로 특정 경로에 요청이 오면, JWT Filter를 통해 검증한 후 일시적 요청에 대한 세션을 생성한다. (세션은 요청 종료 후 소멸됨)

UsernamePasswordAuthenticationFilter : 요청 아이디와 비밀번호를 꺼내어 로그인을 진행한다고 AuthenticationManager 한테 넘겨준다. 그러면 DB로부터 회원정보를 가져와서 일치하는지 검증을 시도한다.SuccessfulAuthentication 이 동작을 한다. 이때 JWT를 생성하여 사용자에게 응답을 한다.스프링 시큐리티는 클라이언트의 요청이 여러개의 필터를 거쳐 DispatcherServlet(Controller)으로 향하는 중간 필터에서 요청을 가로챈 후 검증(인증/인가)을 진행한다.
Delegating Filter Proxy
서블릿 컨테이너 (톰캣)에 존재하는 필터 체인에 DelegatingFilter를 등록한 뒤 모든 요청을 가로챈다. 가로챈 요청은 SecurityFilterChain에서 처리 후 상황에 따른 거부, 리디렉션, 서블릿으로 요청 전달을 진행한다.

SecurityFilterChain의 필터 목록과 순서
모든 필터가 활성화 되는 것은 아니다.

JWT에 관해 발급과 검증을 담당할 클래스가 필요하다. 따라서 JWTUtil이라는 클래스를 생성하여 JWT 발급, 검증 메소드를 작성한다.
JWT 구조 : Header.Payload.Signature 구조로 이루어져 있다.
JWT의 특징은 내부 정보를 단순 BASE64 방식으로 인코딩하기 때문에 외부에서 쉽게 디코딩 할 수 있다.외부에서 열람해도 되는 정보를 담아야하며, 토큰 자체의 발급처를 확인하기 위해서 사용한다.
즉, 토큰 내부에 비밀번호와 같은 값 입력 금지
암호화 키 저장
암호화 키는 하드코딩 방식으로 구현 내부에 탑재하는 것을 지양하기 때문에 변수 설정 파일(ex. application.properties)에 저장한다.