springframework/시작하자SpringSecurity 44

14.DelegatingFilterProxy, FilterChainProxy

DelegatingFilterProxy Filter는 Servlet 2.3 이상부터 적용된 기술이다. Spring 에서 필터가 동작한다는 것은 SpringContext 안에 Filter들이 있다는 뜻이된다. 하지만 Filter 는 ServletContext에 존재해 영역이 다르다. 결국 Filter는 스프링 기술이나 Bean을 Injection 받을 수 없다. 이렇게 각자 영역이 다른 상태에서 Servlet Spec 에서 사용되는 Filter를 사용할 수 있게끔 하는 것이 DelegatingFilterProxy 이다. DelegatingFilterProxy 의 작동원리 SpringBean 이 Filter를 상속한다. 이는 Filter Type Bean을 의미한다. DelegatingFilterProxy ..

13. 사이트 간 요청위조 : CSRF, CsrfFilter

CSRF( Cross Site Request Forgery ) 사이트 간 요청 위조 공격 사용자가 인증을 완료하여 서버에서 JSESSIONID를 받급 받는다. 공격자는 이메일과 같은 방법으로 링크를 사용자에게 전달 사용자가 링크를 여는 즉시 사용자의 브라우저는 이미지파일을 로딩하기위해 img 태그의 src 속성 값으로 서버 주소, 공격자의 주소 값으로 요청을 보낸다. 결국 인증된 사용자의 브라우저로 요청이 가므로 서버는 쿠키를 검사하고 인증된 사용자로 판단 사용자는 승인, 인지 없이 공격자의 배송지가 등록됨으로 공격이 완료된다. Form 인증 - CsrfFilter SpringSecurity 는 모든 Request 에 대해 랜덤하게 생성된 CsrfToken 을 HTTP Prameter 로 요구한다. Re..

12.ExceptionTranslationFilter, RequestCacheAwareFilter

ExceptionTranslationFilter 크게 2가지의 Exception 을 처리한다. AuthenticationException : 인증 예외 AccessDeniedException : 인가 예외 AuthenticationException , AccessDeniedException은 누가 Throw 할까. FilterSecurityInterceptor 라는 필터이다. SpringSecurity의 보안필터 중 제일 마지막에 위치한다. FilterSecurityInterceptor 앞에 위치한 Filter 가 ExceptionTranslationFilter 이다. ExceptionTranslationFilter 는 Try-Catch 문으로 감싸서 FilterSecurityInterceptor 를 호..

11. 권한 설정과 표현식

인가 API의 권한 설정방식과 Mapping 방식 인가 API 의 권한 설정에는 2가지가 있다. 선언적 방식 동적방식 : DB 연동 각 방식들은 다시 2가지 방식을 가진다. URL Method 지금은 , 선언적 방식과 URL 방식을 사용한다. 권한 설정 API antMatcher(url) : 경로에 대한 Ant 패턴, 해당 경로에 대한 권한여부를 검사하게 한다. 사용하지 않을시 모든 요청에 대해 권한여부를 검사한다. authorizeRequest() : 인가 요청 antMatchers(url ...) 이후에 인가 API들이 추가 된다. 주의할 점은, 코드는 위에서 아래로 해석하므로 반드시 구체적인 경로가 먼저 오고 뒤에 넒은 범위의 경로가 와야한다. 이후 http .anyRequest().authenti..

10.SessionManagementFilter, ConcurrentSessionFilter

세션 제어 필터인 SessionManagementFilter 와 ConcurrentSessionFilter 의 자세한 동작구조를 알아본다. SessionManagementFilter . 세션관리 : 인증 시에 사용자의 세션정보를 등록, 조회, 삭제 등의 세션 이력 관리 동시적 세션 제어 : 동일 계정으로 접속이 허용되는 최대 세션 수 제한 세션 고정 보호 : 인증할 때 마다 세션 쿠키를 새로 발급하여 공격자의 쿠키 조작 방지 세션 생성 정책 ConcurrentSessionFilter . 매 요청 마다 사용자의 세션 만료 여부 체크 만료되었을 경우 즉시 만료 처리시킴 session.isExpired() == true 일 경우 로그아웃 처리 즉시 오류 페이지 응답해 줌, "This session has be..

9.세션 동시 제어 / 세션 고정 보호 / 세션 정책

동시세션 제어 전략이란. 최대 세션의 허용 개수가 초과되었을 때에 Session을 어떻게 유지시킬 것인지에 대한 전략이다. 허용 세션 개수가 1개임을 가정. 2가지의 전략을 가진다. 이전 사용자 세션 만료 전략 사용자 1이 인증 요청 후 성공 SpringSecurity는 Session을 생성해준다. 사용자 2가 같은 계정으로 인증 요청 후 성공 SpringSecurity는 Session을 생성해주고 이전사용자의 Session은 Expire 설정을 걸어 둠 사용자 1이 다시 자원을 요청하면 SpringSecurity는 만료 설정된 사용자 1의 Session을 실제로 expired 시켜버림 즉, 새로운 인증 성공시 마다 이전 사용자의 세션은 만료 설정되고 이전 사용자가 자원접근을 요청할 경우 이전사용자의 S..

8.AnonymousAuthenticationFilter

AnonymousAuthenticationFilter..? 익명사용자와 인증사용자와의 구분을 위해 만들어진 필터이다. Authentication 객체를 Session에 저장하지 않는다. 화면에 메뉴여부를 판단할때 isAnonymous() , isAuthenticated() 등으로 줄 수 있다. 처리 과정. 자원 접근에 대한 Request AnonymousAuthticationFilter 에서 Session의 SecurityContextHolder 의 SecurityContext에 Authentication 객체가 있는지 확인 있다면 chain.doFilter() 없다면 AnonymousAuthenticationToken 객체를 만들어서 AnonymousUser 객체, ROLE_ANONYMOUS 권한을 저..

7.RememberMeAuthenticationFilter

RememberMeAuthenticationFilter 의 동작조건. RememberMeAuthenticationFilter는 특정조건을 수립해야만 동작하는 필터이다. SecurityContext의 Authentication 객체가 null일경우 = 이는 Session만료나 브라우저의 종료를 의미한다. 결국, Remember-Me 쿠키가 존재하든 하지않든 RememberMeAuthenticationFilter는 동작하게 된다. Login(인증) 시기에 사용자가 RememberMe 서비스를 체크하고 인증에 완료했을 경우 이경우에는 첫번째 조건을 포함한다. 이유는 Session이 만료되어 SecurityContext 의 Authentication 객체가 null 이 되는 것이 선행 조건이기 때문이다. 요청시..

6.Remember Me 인증

Remember Me 기능..? Remember Me 기능을 활성화하면 Spirng Security 는 세션이 만료되거나 브라우저가 종료된 뒤에도 어플리케이션이 사용자를 기억하게끔한다. Remeber Me 기능을 활성화 한 상태에서 사용자의 요청 Spring Security는 Remember-Me 쿠키에 대한 Http 요청을 확인 후 토큰 기반 인증을 사용하여 유효성을 검사, 검증이 되면 자동으로 로그인 됨 사용자 요청의 라이프사이클 인증성공 : Remember-Me 쿠키 설정 인증실패 : 쿠키 존재시 무효화 로그아웃 : 쿠키 존재시 무효화 Remember Me 기능을 위한 API들 http.rememberMe() : rememberMe 기능이 작동 rememberMe() 의 하위 API들 remembe..

5.LogoutFilter

Spring Security 의 로그아웃 과정 유저가 request("로그아웃경로") 요청 SpringSecurity 가 세션을 무효화(SESSIONID 삭제, Invalidate) , 인증토큰삭제(UsernamePasswordAthenticationToken), 관련된 쿠키(remeber-me 등)를 제거. 지정한 경로로 Redirect 시킴. 로그아웃 처리를 위한 API들 http.logout() : 로그아웃 처리를 담당 Logout 처리를 위한 하위 API logoutUrl(url) : 로그아웃 처리 url을 지정, default = /logout logoutSuccessUrl(url) : 로그아웃 성공시 이동 경로, default = /login deleteCookies(cookieName...)..