Security(시큐리티)에 관해서 공부해보겠습니다.
공부하려면 먼저 요청이 어떻게 흐르는지 알아야하는데
제가 매일 했던 controller안의 실행 메소드 들을 찾아내는 과정은 모두
DispatchServlet 이 녀석이 해결하고 있었습니다.
이런 흐름 이였습니다. Controller들은 제가 어노테이션으로 등록된 클래스 들입니다.
중요한 것은 서블릿 컨테이너 안에
Filter 들이 서로 체인처럼 엮여 있어 필터 체인이라고도 하며 무조건 필터를 거쳐서 들어갑니다.
중요한 점은 무조건 적으로 위의 필터들을 모두 거쳐가야 한다는 것 입니다.
전에 토큰 강의를 보면 알 수 있지만
시큐리티 설정에서 제가 직접 필터를 만들어 넣을 수도 있고 정책도 추가할 수 있었습니다.
만약 위의 그림대로라면 모든 필터를 거쳐야 하기에 문제가 발생할 수 있는데
Spring Security는 아래와 같은 선택을 했다고 합니다!
다양한 Filter들을 중간에 DelegatingFilterProxy 라는 메인 필터체인에 넣어주고 나머지를 Chain 합니다.
스프링 시큐리티에서 지원해주는 필터들은
아래 사진을 참고하시면 됩니다!
다른 필터들도 사용하지만 가장 많이 사용하는 필터 중 하나는
UsernamePasswordAuthenticationFilter 입니다.
Username / password 로그인 시도로 할 때 필터해줍니다.
또한 토큰 강의를 들으면서 가장 궁금해 했던 Authentication 헤더에 Bearer 토큰 (예, JWT) 을 넣어서 보내주면
알아서 필터 해주는 것이 무엇일까 했는데 공부해보니
BearerTokenAuthenticationFilter 였습니다.
그리고 토큰 check를 할 때 필요한 Filter는
BasicAuthenticationFilter 였습니다. Authentication 헤더에 Basic 토큰 (JWT)을 담아 보내주면 검사해서
인증 처리를 해줍니다!
위의 체인, 필터체인 설정 방법은 WebSecurityConfigurerAdapter을 상속받은
클래스를 이용해서 오버라이드를 통해 진행합니다.
만약 EnableWebSecurity(debug= true) <- 이렇게 해놓는다면
필터들이 어떻게 타고 들어가있는지 콘솔로 보여줍니다. (default = false)
이렇게 콘솔 창에 확인해볼 수 있습니다.
위처럼 필터 또한 껐다 킬 수 있습니다.
그렇다면 아래 그림처럼 어떤 url 에서 필터 체인이 동작하는지 정하는 방법은
andMatcher를 통해서 설정해줍니다.
그렇다면 여러 정책을 통해서 필터체인을 작동시킬지 말지를 정해야 하는데
그 방법은
아까 올린 WebSecurityConfigurerAdapter를 상속받은 config 클래스를 하나 더 만들어서
똑같이 andMatcher 설정을 해주면 되는데
중요한 점은 필터체인들은 순서가 중요하니 Order 어노테이션으로 순서를 정해 주면 됩니다.
AuthenticationManager가 Authentication(인증)을 해줘서 인증 결과를 contextHolder에 넣어줍니다.
출처 :
스프링부트 Java/Spring 웹 개발 마스터 초격차 패키지 ,
https://gitlab.com/jongwons.choi/spring-boot-security-lecture/-/blob/master/part1/