Spring/Spring Security
HeaderWriterFilter - 응답헤더에 보안 관련 헤더 추가하는 필터
HeaderWriterFilter - 응답헤더에 보안 관련 헤더 추가하는 필터 응답 헤더에 보안 관련 헤더를 추가해준다. 기본적으로 생성되는 필터이며 앞단부분에 위치하는 필터이다 내부적으로 HeaderWrite 인터페이스를 List로 가지고 있다. private final List headerWriters; 기본적으로 5개의 header writer 적용 XContentTypeOptionsHeaderWriter : MIME타입 스니핑 방어 XXssProtectionHeaderWriter : 브라우저에 내장된 XSS 필터 적용 CacheControlHeadersWriter : 캐시 히스토리 취약점 방어 XFrameOptionsHeaderWriter : HTML삽입 취약점 방어로 iframe, object ..
AccessDecisionVoter 커스텀
요구사항 "/admin" URL 접근에 대한 접근 권한 검사 Admin 사용자의 로그인 아이디 끝 숫자가 홀수 인 경우 접근 허용 URL이 "/admin" 이 아닌 경우 접근을 승인함 기본 expressionHandler를 사용 accessDecisionManager 인터페이스 구현체 중 UnanimousBased를 사용 SecurityConfig 구현 - HttpSecurity, AccessDecisionManager 설정 @Configuration @EnableWebSecurity public class SecurityConfig { public AccessDecisionManager accessDecisionManager() { List
ExceptionTranslationFilter - 예외 전환 필터
FilterSecurityInterceptor 바로 위에 위치하며, FilterSecurityInterceptor 실행 중 발생할 수 있는 예외(AccessDeniedException과 AuthenticationException을)를 잡고 처리한다 FilterSecurityInterceptor는 FilterChainProxy에서 필터 가장 마지막에 위치한다. 필터 체인에서 발생하는 AccessDeniedException과 AuthenticationException을 처리하는 필터 처리할 수 없는 예외는 rethrow 하여 그냥 앞으로 던져버린다. FilterSecurityInterceptor 가 AccessDecisionManager 를 통해 AuthenticationException 혹은, Access..
AccessDecisionManager, AccessDecisionVoter - 인가 결정 심의자
AccessDecisionManager는 AbstractSecurityInterceptor에서 호출하며, 최종적인 접근 제어를 결정한다. FilterSecurityInterceptor (AbstractSecurityInterceptor) AccessDecisionManager는 세 가지 메소드가 있다: void decide(Authentication authentication, Object secureObject, Collection attrs) throws AccessDeniedException; boolean supports(ConfigAttribute attribute); boolean supports(Class clazz); decide() : 권한을 결정하기 위해 필요한 모든 정보를 건내 받는다..
Security 인가 처리 개념 및 과정 (Authorization), AccessDecisionManager
인가(Authorization) : 인증 된 사용자가 특정 자원에 접근하고자 할 때 접근 할 자격이 되는지 증명하는 것 사용자가 특정 자원에 접근하고자 요청(Request)을 하면 그 사용자가 인증을 받았는지 확인한다. 그림상 사용자의 자격(권한)은 Manager이다 인증을 받은 사용자라면 해당 사용자의 자격(권한)이 해당 자원에 접근할 자격이 되는지 확인한다. 일반적으로, 인가를 처리하는 Spring Seucirty FilterSecurityInterceptor에 도착하면 인증이 완료되어있다. 익명 사용자도 인증이 완료된 것으로 간주하며, ROLE_ANONYMOUS 권한을 갖음 인가 처리(Authorization) 에서 사용자의 권한(자격) Manager이기 때문에 User Section, Manage..
FilterSecurityInterceptor - 인가(Authorization) 처리 필터
필터 체인 상에서 가장 마지막에 위치하며, 사용자가 갖고 있는 권한과 리소스에서 요구하는 권한을 취합하여 접근을 허용할지 결정한다. 실질적으로 접근 허용 여부 판단은 FilterSecurityInterceptor 내부 프로세스에서 AccessDecisionManager 인터페이스 구현체에서 이루어짐 해당 필터가 호출되는 시점에서 사용자는 이미 인증이 완료되고, Authentication 인터페이스의 getAuthorities() 메소드를 통해 인증된 사용자의 권한 목록을 가져올수 있다 익명 사용자도 인증이 완료된 것으로 간주하며, ROLE_ANONYMOUS 권한을 갖음 일단 인증이 되어있다. 인가 여부에 따라 응답해줄지, 예외를 던질지 달라진다. AbstractSecurityInterception.att..
SessionManagementFilter, ConcurrentSessionFilter - 세션 관리 필터
SessionManagementFilter - 세션 관리 필터 SpringSecurity에서 세션 관리에 관련된 기능을 제공해주는 필터이다 https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/#session-mgmt 필터 순서가 뒷 부분에 존재한다. ConcurrentSessionFilter와 함께 동시세션 만료를 해준다 SessionManagementFilter는 다음과 같은 역할을 한다. 세션 관리 : 인증시 사용자의 세션정보를 등록, 조회, 삭제 등의 세션이력을 관리 동시적 세션 제어 : 동일 계정 - 접속 허용 최대 세션수 제한 동시 세션을 확인하고, 필요시 세션을 만료처리해준다 세션 고정 보호(se..
SecurityContextPersistenceFilter - SecurityContext 영속화 필터, SecurityContextRepository
SecurityContextPersistenceFilter - SecurityContext 영속화 필터 SecurityContext라는 녀석을 영속화 하는 책임을 가진 필터 보통 필터 목록 중 2번째 또는 3번째 위치하며 거의 최상단에 위치하는 필터이다. SecurityContextRepository 인터페이스 구현체를 통해 사용자의 SecurityContext 객체를 생성, 저장, 조회한다 SecurityContext가 존재하지 않는다면, empty SecurityContext를 생성 SecurityContextRepository 인터페이스 기본 구현은 Session을 이용하는 HttpSessionSecurityContextRepository 클래스 별도의 변경이 없다면, HttpSessionSecur..
RememberMeAuthenticationFilter, RememberMeSevices
세션이 사라지거나 만료가 되더라도 쿠키 또는 DB를 사용하여 저장된 토큰 기반으로 Remember-Me 인증에 사용되는 필터이다. 먼저, RememberMeAuthenticationFilter에서 인증이 진행되는데 이 필터가 존재하려면 Remember-Me 기능이 활성화 되어야 한다. 이 필터는 필터들은 중 뒷부분에 존재한다 default로는 DefaultLoginPageGeneratingFilter나 UsernamePasswordAuthenticationFilter보다 뒤에 존재함 RememberMeAuthenticationFilter 필터가 실행될 조건은 다음과 같다. 스프링 시큐리티에서 사용하는 인증객체(Authentication)가 Security Context에 없어야 함 세션 만료(time o..
Remember-ME 인증과정
Remember-ME? 세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는기능이다. 보통 로그인 창에는 체크박스로 로그인 기억(로그인 저장) 등을 지원하는데, 사용자는 일반적으로 로그인 후에 서버에서 Remember-me 관련 쿠키로(cookie) 보내주면 다음 요청시, 명시적으로 로그아웃 하지 않는이상 계속 로그인 되있는 것처럼 쿠키 기반으로 인증을 하는 방식이다. Remember-Me가 무엇인지 정리하자면 다음과 같다 일반적으로 로그인 한 후에 브라우저를 끄거나, 일정 시간이 지나 세션이 만료되는 경우 명시적으로 로그아웃 하지 않더라도 로그아웃이 된다. 이 때 재 로그인 하지 않더라도 세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는기능이다. 인증되..