HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
🥾
[Security] - Security Filter
🥾

[Security] - Security Filter

progress
Done
Tags
Spring

🧑🏻‍💻 강의내용

  • WebSecurity 클래스는 필터 체인 관련 전역 설정을 처리할 수 있는 API 제공
    • ignoring()
      • Spring Security 필터 체인을 적용하고 싶지 않은 리소스에 대해 설정
      • 일반적으로 정적 리소스(*.html, *.css, *.js 등)을 예외 대상으로 설정함
      • 불필요한 서버 자원 낭비를 방지함

🚀 WebSecurity - 필터 체인 등록

여기서 필터체인이 만들어져서 등록됩니다.
public final class WebSecurity extends AbstractConfiguredSecurityBuilder<Filter, WebSecurity> implements SecurityBuilder<Filter>, ApplicationContextAware, ServletContextAware { ... @Override protected Filter performBuild() throws Exception { Assert.state(!this.securityFilterChainBuilders.isEmpty(), () -> "At least one SecurityBuilder<? extends SecurityFilterChain> needs to be specified. " + "Typically this is done by exposing a SecurityFilterChain bean " + "or by adding a @Configuration that extends WebSecurityConfigurerAdapter. " + "More advanced users can invoke " + WebSecurity.class.getSimpleName() + ".addSecurityFilterChainBuilder directly"); int chainSize = this.ignoredRequests.size() + this.securityFilterChainBuilders.size(); List<SecurityFilterChain> securityFilterChains = new ArrayList<>(chainSize); List<RequestMatcherEntry<List<WebInvocationPrivilegeEvaluator>>> requestMatcherPrivilegeEvaluatorsEntries = new ArrayList<>(); // ✨ 1-1. 여기서 WebSecurity - ignoring이 등록된 것이 Start! for (RequestMatcher ignoredRequest : this.ignoredRequests) { WebSecurity.this.logger.warn("You are asking Spring Security to ignore " + ignoredRequest + ". This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead."); /** ✨ 1-2. DefaultSecurityFilterChain 등록하는데...? 생성자에서 2번째 인자값으로 필터를 넘겨주질 않으니 필터 없이 등록이 된다. public DefaultSecurityFilterChain(RequestMatcher requestMatcher, Filter... filters) {...} */ SecurityFilterChain securityFilterChain = new DefaultSecurityFilterChain(ignoredRequest); securityFilterChains.add(securityFilterChain); requestMatcherPrivilegeEvaluatorsEntries .add(getRequestMatcherPrivilegeEvaluatorsEntry(securityFilterChain)); } // ✨ 그 외의 경우에는 여기서 필터 체인을 만들어서 등록 for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : this.securityFilterChainBuilders) { SecurityFilterChain securityFilterChain = securityFilterChainBuilder.build(); securityFilterChains.add(securityFilterChain); requestMatcherPrivilegeEvaluatorsEntries .add(getRequestMatcherPrivilegeEvaluatorsEntry(securityFilterChain)); } if (this.privilegeEvaluator == null) { this.privilegeEvaluator = new RequestMatcherDelegatingWebInvocationPrivilegeEvaluator( requestMatcherPrivilegeEvaluatorsEntries); } FilterChainProxy filterChainProxy = new FilterChainProxy(securityFilterChains); if (this.httpFirewall != null) { filterChainProxy.setFirewall(this.httpFirewall); } if (this.requestRejectedHandler != null) { filterChainProxy.setRequestRejectedHandler(this.requestRejectedHandler); } filterChainProxy.afterPropertiesSet(); Filter result = filterChainProxy; if (this.debugEnabled) { this.logger.warn("\n\n" + "********************************************************************\n" + "********** Security debugging is enabled. *************\n" + "********** This may include sensitive information. *************\n" + "********** Do not use in a production system! *************\n" + "********************************************************************\n\n"); result = new DebugFilter(filterChainProxy); } this.postBuildAction.run(); return result; } }
📌 디버깅을 해보면 결과적으로 ignoring 용 NoFilter Chain과 나머지 가 생성되는걸 볼수 있습니다.
notion image
( /api/v1/users/join 을 WebSecurity-ignoring으로 등록했습니다.)

🤡 HttpSecurity - permitAll()

Login URL을 HttpSecurity - ignoring으로 설정 하고,
notion image
요청을 했을 때!
notion image
✨ 결과적으로 FilterChain의 갯수가 꽉찼음을 확인할 수 있었습니다.
notion image

👺WebSecurity - ignoring

URL 하나를 WebSecurity - ignoring으로 설정 하고,
notion image
요청을 했을 때!
notion image
✨ 결과적으로 FilterChain의 갯수가 0개임을 확인할 수 있었습니다.
notion image
 

🔫 추가

  • HttpSecurity, WebSecurity 둘다 동일한 URL을 등록하는 경우, WebSecurity가 우선적으로 적용 🤔 
    • notion image
      WebSecurity에서 필터체인을 등록할 때, ignoring을 먼저 등록을 했으니.. 순서가 첫번째! 그래서 먼저 매칭이 되어 우선 적용이 되는 것이외다!
 

🔖 참고

[Spring Security] Spring Security Basic - Ignoring
SpringSecurity를 설정 하고 아무런 셋팅을 하지 않으면 모든 요청에 대해서 인증을 요청하는 설정이 추가가 된다. Web application을 개발하게 되면 js, css 등 static resource에 대해서도 요청이 들어 오게 되는데 static resource들은 인증을 확인하지 않고 무시하는게 서버 리소스를 낭비하지 않는 최고의 방법이다. 어떻게 하면 Request 요청시에 Security 설정을 타지 않고 by pass할 수 있는지에 대해서 알아 보자.
[Spring Security] Spring Security Basic - Ignoring
https://kangwoojin.github.io/programing/spring-security-basic-ignoring/#httpsecurity%EC%97%90-permitall%EA%B3%BC-%EC%B0%A8%EC%9D%B4
[Spring Security] Spring Security Basic - Ignoring
SpringSecurity(위임필터 초기화)
DelegatingFilterProxy이클래스는 서블릿Fiter이다 스프링에서 관리하는 필터가 아니다 그래서 DelegatingFilterProxy 사용자에게 전달받은 데이터를 스프링이 관리하는 빈에 전달해주는 역할을 한다 이후에 스프링 시큐리티는 필터기반으로 요청에 대한 보안처리를 하게된다. SpringSecurityFIlterChain 이름으로 생성된 빈을 ApplicaitonContext 에서 찾아 요청을 위임 실제 보안처리를 하지 않는다 1.springSecurityFilterChain 의 이름으로 생성되는 되는데 실제로 스프링 시큐리티가 초기화 될때 생성된다.
SpringSecurity(위임필터 초기화)
https://anjoliena.tistory.com/26
SpringSecurity(위임필터 초기화)
👀 본듯 안본듯..