Spring Security/jwt
Spring security JWT - 7. ignore 설정으로 filter 무시하기
Ssemi-Column
2023. 12. 4. 17:40
728x90
저번글까지는 JWT filter에서 ANONYMOUS 라는 값으로 계속 비교하여 토큰값이 없을때에도 접속이 가능했다.
- 로그인이 됐을때만 동작하는 /me API가 동작된다 (값에 ANONYMOUS를 넣었기 때문에)
WebSecurityCustomizer 를 사용하여 filter를 타지 않는 ignore 설정을 할 수 있다고한다.
이렇게하면 Security FilterChain을 거치지않고 동작할 수 있는 것 같다.
코드
- WebSecurityCostomizer를 Bean으로 등록한다.
- 기존에 여기에 적었던 위 API 리스트들은 위에 적었기 때문에 삭제해도 된다.
- 기존에 JwtAuthenticationFilter를 주입받아 사용했는데, 여기선 그냥 생성하여 사용한다
- Bean으로 등록하면 Security filterChain이 아닌 Default filterChain에 등록되어 Security filterChain을 막아도 동작된다고한다.
- Bean으로 등록하지 않기 때문에 Component제거
- 기존에 Token 값을 가져오는 메소드는 이제 ANONYMOUS를 비교할 필요가 없어졌기때문에 삭제
- 마찬가지로 위 filter를 타지않을 것이기 때문에 ANONYMOUS:ANONYMOUS 라는 값을 넣을 필요도 없어진다.
- 위에서 매소드를 지웠기 때문에 여기서 header에서 값을 가져온다음 substring으로 토큰 값을 가져 올 수 있다.
- 하지만 위에서 설정한 API 외에 다른 API를 token을 발급받지 않은 상태로 호출할 수 있기 때문에 throw Exception 처리를 해줬다 (NullPointException말고 잘못된 접근을 표시하는 Exception으로 바꾸는게 맞을 것 같다)
코드 실행
- Swagger에서 해당 API를 호출해보면 전과달리 403에러가 발생한다.
- 로그에는 위에 적은 것처럼 인증되지 않은 사용자가 인증이 필요한 API를 요청했을때 header에서 가져온 값이 null 이여서 발생한 에러이다.
- 에러는 null로 400 에러가떠야 맞으나, 403에러가 뜨는 이유는 Spring security는 에러를 /error 라는 페이지로 이동 시키는데, 위 API가 ignor에 등록되지않아 403에러가 발생한 것이다. (이 부분은 다음에 다른 글로 작성예정)
- 로그인 요청은 위에 ignore에 등록했기 때문에 성공한다.
- 인증을하면 요청헤더에 Authentication 으로 데이터가 설정되었고, /me API가 정상으로 작동된다.
- 위 코드로 swagger, 로그인등 filter를 타지않고 접속가능한 api를 설정 할 수 있지만, 서버를 구동해보면 위처럼 WARN log가 있다.
- 해석해보면 ignore를 설정해서 filter를 타지않는 방법은 권장하지 않는다. permitAll을 사용하도록 수정하라 라고 적혀있는데, 이렇게 해결하는 방법은 찾아봐야겠다.
728x90
반응형
LIST