JWT 정보를 API 서버에서 전달 받았을 때 검증을 해야한다.
JWT 검증을 위한 필터를 만들어보자
OncePerRequestFilter를 상속받는 필터 클래스를 생성한다.
-> http 요청에 단 한번만 호출하는 필터이며 Spring에서 지원
@Override 할 메서드는 shouldNotFilter, doFilterInternal 두 가지 메서드
shouldNotFilter
JWT 필터 확인을 하지 않을 URI를 지정하기 위한 메서드이다.
위에 적혀 주석되어 있듯이 true가 반환되면 JWT 체크를 진행하지 않는다
doFilterInternal
[doFilterInternal 내부 로직 설명]
1. authHeaderStr : Authorization이라는 헤더에 들어가있는 body 값을 가져온다.
2. accessToken : authHeaderStr.substring(7)이 작성되어있는 것 처럼 앞에 7자리는 잘라내고 가져온다.
-> 왜? 바디부분에 Bearer 부분을 제외한 나머지 accessToken 값을 가져와야 하기 때문이다.
3. validationToken(accessToken) : 만들어둔 검증 로직으로 토큰 검증 후 개채 정보 반환 값을 받아온다.
4. JWT내부에 들어가있던 값들을 꺼낸다.
5. UsernamePasswordAuthenticationToken, SecurityContextHolder에 대해서는 아래 참조.
6. 예외처리
UsernamePasswordAuthenticationToken과 SecurityContextHolder에 대한 간단한 설명
UsernamePasswordAuthenticationToken
(A) principal : 사용자의 주체를 의미하며 사용자 정보를 전달 받는다.
(B) credentials : 사용저 인증정보를 의미하며 보통 사용자의 비밀번호를 전달
(C) authorities : 사용자 권한을 의미하며 각 권한은 GrantedAuthority 인터페이스 구현 객체가 전달되어야 한다
SecurityContenxtHolder
보안 컨텍스트를 제공하는데 사용되는 객체이며 인증된 사용자의 정보를 저장하고 제공
(A) getContext() : 현재 실행중인 스레드에 대한 보안 컨텍스트 호출
(B) setAuthentication() : 보안 컨텍스트에 사용자의 인증 정보를 설정한다.
-> 인증 확인 후 UsernamePasswordAuthenticationToken 인증 토큰에 담아서 setAuthentication 메서드를 통해 보안 컨텍스트 설정
SecurityFilterChain
위에서 설정한 JWT 검증 필터가 동작 할 수 있도록 SecurityFilterChain 메서드에 추가로 설정해둔다.