kiwi

cors와 spring security filter chain

by 키위먹고싶다

CORS

 

CORS는 cross-origin- resource sharing의 약자로 교차 출처 리소스 공유이다.  HTTP 서버의 웹 페이지, 이미지 파일이나 API 등을 특정 호스트로 접속한 웹 브라우저만 사용할 수 있게 제한하는 정책이다. 

 

오늘날 웹 서비스는 수많은 서브 도메인으로 구성되어있다. 웹서버(프론트엔드)와 API 서버(백엔드)를 구분할 때 사용하기도 하고 제공하는 기능을 단위로 웹 서비스를 나눌 때도 사용한다. 

 

 

네이버의 블로그와 카페는 같은 회사이지만 다른 서비스를 제공하며 각각의 도메인을 가지고 있다.

 

이때 네이버 블로그에서 자바스크립트를 이용해 카페주소로 이미지 또는 API요청을 한다고 가정해보자. 

이때 CORS정책이 설정되지 않으면 동일 출처 정책 때문에 네이버 블로그는 자신의 도메인(section.blog)을 제외한 서브 도메인으로 HTTP 요청을 할 수 없다. 

 

동일 출처 정책

사전에 지정하지 않은 다른 곳에서 웹 페이지, API같은 리소스 요청을 차단하는 방어 장치이다. 그래서 다른 웹 사이트에서 이미지, 동영상과 같은 리소스를 무단으로 가져가는 상황을 방지할 수 있다. 그러나 이 정책 때문에 서로 다른 서브 도메인 간 리소스 공유를 어렵게 만들었기 때문에 CORS가 생겼다.

 

CORS가 사전에 지정하지 않은 도메인으로 호출을 막는 사실이지만 이 방어 정책은 브라우저에 해당되므로 해킹된 웹 서버에서 악성 자바스크립트가 실행되거나 민감한 데이터가 유출되는 것은 막을 수 없다.

 


SecurityFilterChain

 

Spring Security는 DelegatingFilterProxy라는 필터를 만들어서 메인 필터 체인(서블릿 필터들 사이)에 끼우고  그 아래 다시 SecurityFilterChain을 그룹화 한다. 그렇게 해서 URL에 따라 적용되는 필터 체인을 다르게 하는 방법을 사용하며 어떤 경우는 해당 Filter를 무시하고 통과하게 할 수도 있다. 

 

참고로 Spring Security는 Filter Layer에서 Filter기반으로 동작하므로 DispatcherServlet이전에 실행된다.

그러므로 Spring MVC와 분리되어 동작한다.   

 


security 의 주요 filter

 

WebAsyncManagerIntegrationFilter SpringMVC에서 Async관련 기능을 사용할때 SecurityContext를 서로 다른 Thread간에 공유할 수 있도록 도와주는 필터
SecurityContextPersistenceFilter SecutiryContextRepository를 통해 SecurityContext를 조회하거나 저장하는 필터
HeaderWriterFilter 응답헤더에 시큐리티 관련 헤더를 추가해주는 역할을 하는 필터
CorsFilter 허가된 요청인지 검사하는 필터
LogoutFilter 로그아웃 URL(기본값 : /logout)로의 요청을 감시하여 해당 사용자를 로그아웃 시킴
UsernamePasswordAuthenticationFilter  username과 password기반의 인증과정을 거치며 인증 성공 시 Authentication 객체를 SecurityContext에 저장하는 필터
BasicAuthenticationFilter 요청 헤더의 값을 읽어와 SecurityContextHolder에 저장하며 매번 요청마다 인증을 시도하므로 stateless함
RequestCacheAwareFilter 인증을 필요로 하는 리소스에 대한 요청을 할 경우 인증을 먼저 하고 해당 리소스로 이동하는데 이전 요청을 캐시해두었다가 인증을 처리하고 캐시해두었던 요청을 처리함
SecurityContextHolderAwareRequestFilter security관련 메서드들을 스프링 시큐리티 기반으로 구현체를 연결해주는 역할 
AnonymousAuthenticationFilter Authentication이 null인것을 방지하기 위해 SecurityContextHolder에 익명 Authentication객체를 넣어주는 역할
SessionManagementFilter Session변조 공격 방지 기능, 로그아웃 시 세션을 만료시키며 유효하지 않은 세션이 접근했을 때 어디로 보낼 것인지 URL을 설정하며 동시 접속을 제한 하여 기존에 생성된 세션을 유지하고 이후에 로그인을 시도하면 로그인을 막아버린다. 그러나 설정을 통해 새로운 로그인 시 이전 세션을 만료시키고 새로운 세션을 적용하며 STEATELESS설정 시 캐시 필터도 사용되지 않는다. 캐시는 SecurityContext를 캐싱하기 때문이다(세션을 정말 사용하고 싶지 않을 때 사용하는 전략이다)
ExceptionTranslationFilter 인증/인가 예외를 처리하는 필터
FilterSecurityInterceptor Resource관련 설정을 관리하며 AccessDecisionManager를 통해
authorizeRequests()의 하위 정보를 기본으로 특정 리소스에 접근할때 필요한 권한이 있는지 확인 후 인가 처리하며 예외가 날 경우 앞선 필터인 ExceptionTranslationFilter에서 Exception을 처리한다

 

 

블로그의 정보

kiwi

키위먹고싶다

활동하기