JWT란? (Json Web Token)
- 헤더 : 어떤 알고리즘을 사용해서 서명했는지에 대한 내용
- 페이로드 : 정보들 담기
- 서명 : 헤더, 페이로드 데이터를 암호화
JwtAuthenticationFilter
=> 인증을 수행하는 필터
- 클라이언트로부터 username, password를 받는다.
- 파싱 후 LoginReqDto로 반환하고 강제로 로그인해 인증용 토큰을 생성한다.
- UserDetailsService의 loadUserByUsername을 호출한다.
- 호출 후 로그인이 성공하면 LoginUser 객체 생성 후 시큐리티 세션(SecurityContext) 에 담는다. 로그인이 실패하면 실패 에러를 날린다.
(우리가 JWT를 쓴다 하더라도, 컨트롤러 진입을 하면 시큐리티의 권한체크, 인증체크 도움을 받을 수 있으므로 임시 세션을 만든다.)
- JWT 토큰을 생성하고 response 헤더에 JWT 토큰을 담아 브라우저에게 응답한다.
브라우저는 JWT 토큰 만료 시간 전까지 계속 헤더에 JWT 토큰을 담고 있고, 권한이 필요한 페이지에서 JwtAuthorizationFilter 를 호출해 사용한다.
JwtAuthorizationFilter
=> 인가를 수행하는 필터
-
권한이 필요한 모든 주소에서 동작함
-
진행 순서
- 헤더에 든 JWT 토큰을 가져와 검증한다.
- 검증이 성공하면 Authentication(LoginUser) 객체를 생성 하고 강제 로그인을 진행해 스프링 시큐리티의 SecutiryContext에 담는다.
- 이때 이 객체는 인증이 완료되었는지랑 권한 체크용으로만 사용한다.
- 검증이 완료되면 체인을 타고 계속 진행한다.
위 필터들을 SecutiryConfig에 등록해줘야 한다.
토큰 생성 로직은 JwtProcess 클래스에 있음. 검증 로직도 포함! JwtVO 인터페이스엔 JWT의 SECRET key와 환경 변수가 있음.
bank의 test 디렉토리에 jwt 테스트들이 있으니 나중에 참고하기.