Programming-[Backend]/Spring Security (25) 썸네일형 리스트형 [스프링 시큐리티][작성중][메모] 9. 주요 아키텍처 이해 1. 위임 필터 및 필터 빈 초기화 서블릿 컨테이너가 사용하는 filter 중 DelegatingFilterProxy라는 필터가 있어서, 스프링 컨테이너에서 이를 활용한다. DelegatingProxyChainFilter는 springSecurityFilterChain이라는 이름의 스프링 빈을 찾아서 서블릿 컨테이너에 등록하고 사용할 수 있도록 한다. springSecurityFilterChain이 앞선 글들에서 살펴봤던 FilerChainProxy이다. SecurityFilterAutoConfiguration이 서블릿 컨테이너에서 필터들을 등록하는 클래스이다. 스프링의 컨테이너는 WebSecurityConfiguration이며 여기서 생성하는 Bean이 FilterChainProxy이다. FilterC.. [스프링 시큐리티] 8. 위조 방지 : CsrfFilter 1. CSRF(Cross-site Request Forgery) 공부해봤던 공격 방식이다. 쇼핑몰 사이트에 사용자가 로그인을 해서 토큰을 가진채로 공격자가 보낸 링크를 클릭하는 경우, 공격자가 해당 쇼핑몰 사이트에서 배송지를 변경하는 javascript 코드를 심어놓았다면 서버는 사용자의 토큰과 이 코드를 신뢰하여 공격자의 의도대로 배송지를 변경해버리게 된다. 즉, 사용자의 의도와는 무관하게 서버에 요청을 하는 공격 방식을 말한다. 이를 방지하기 위해서 서버는 사용자의 요청 시마다 난수로 생성되는 CSRF Token을 발행한다. 이 토큰은 페이지에 hidden 객체로 들어가게 된다. 그리고 요청시마다 서버에 보내어 토큰의 일치 여부를 서버에서 판단하기 때문에, 공격자가 사용자의 세션 정보를 갖고 있다하더.. [스프링 시큐리티] 7. 예외처리 : ExceptionTranslationFilter, 요청 캐시 필터 : RequestCacheAwareFilter 1. ExceptionTranslationFilter ExceptionTranslationFilter는 예외처리용 필터이다. 로그인 시 다뤄지는 예외는 크게 2가지로 구분할 수 있다. AuthenticationException : 인증 예외 처리 AuthenticationEntryPoint 호출 인증이 실패했을 때 어떻게 handling 할지를 결정한다. 로그인 페이지로 리다이렉트, 401 HttpStatusCode 전달 등의 작업을 수행할 수 있다. 다음 장 코드 실습에서 직접 해본다. RequestCache와 SavedRequest 로그인 전에 어떤 url로 접속했는데 인증이 안되어서 로그인 페이지로 가는 경우, 사용자가 접근한 정보를 RequestCache와 SavedRequest 내에 담아두었다가.. [스프링 시큐리티] [작성중] 6. 권한 설정, 표현식 1. 권한 설정 권한 설정 방식 권한 설정은 2가지 방식을 통해 가능하다. 1. 선언적 방식 URL : http.antMatchers("/users/**").hasRole("USER") method : @PreAuthorize("hasRole('USER')") 2. 동적 방식 DB에 연동하여 URL이나 Method로 권한을 설정한다. 동적 방식은 나중에 다룰 실전 프로젝트에서 다루고, 일단은 선언적 방식에 대해서만 공부한다. 선언적 방식 대략 아래 코드와 같은 방식으로 설정해준다고 보면된다. .antMatchers() 메서드를 이용하는데 어떤 url에 대한 것인지, 그리고 chaining을 통해서 어떤 권한을 가진 사용자가 해당 url에 접근해줄 수 있는지를 설정해준다. 주의할 점은 하위 계층의 구체적인.. [스프링 시큐리티] [작성중] 5. 익명 사용자 인증 필터, 세션 제어 필터 1. AnonymousAuthenticationFilter 익명사용자도 Authentication 객체는 null이 아니다 앞서 대략적으로만 다뤘지만, 스프링 시큐리티는 인증이 됬다면 기본적으로 SecurityContextHolder 내부의 SecurityContext에 인증 정보가 담긴 Authentication 객체의 값이 존재해야하는 구조이다. 익명 사용자를 처리하는 필터는 AnonymousAuthenticationFilter이다. 이 필터는 Authentication의 값을 검사하고, 만약 사용자의 Authentication 정보가 아니라면, AnonymousAuthenticationToken을 생성하고 해당 토큰을 SecurityContext에 넣는다. 익명 사용자라 할지라도 Authentica.. [스프링 시큐리티] 4. Logout, Rember me 필터 1. logout API 로그아웃 API의 사용법은 아래 코드에서 확인할 수 있다. 메서드별 설명은 주석으로 표기했다. SecurityConfig.class http .logout() .logoutUrl("/logout") //logout url 설정 .logoutSuccessUrl("/login") //logout 시 이동할 url만 설정 .addLogoutHandler(new LogoutHandler() { //logout이 성공했을 때 처리할 내용 @Override public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { HttpSession session = .. [스프링 시큐리티] 3. Form Login 인증 방식 파악 계속 : AuthenticationManager, Provider와 SecurityContext 1. 인증 로직 파악(계속) 이 부분도 FomrLogin의 인증 과정을 대략적으로 살펴본 내용일 뿐, 자세한 내용은 뒤에서 다루게 되므로 간단히 훑어보기만 하자. 1. 이어지는 과정과 Authentication 객체 지난 글에서 파악한 부분은 AntPathRequestMatcher까지였다. 서버에서 requestMap형태로 url과 권한 정보를 갖고 있고, 클라이언트가 요청한 url과 비교하는 부분이였다. 여기서 실패하면 chain.doFilter를 통해 다른 필터로 넘어가게 되지만, 일단 성공하게 되면 사용자의 입력 정보를 바탕으로 Authentication 객체를 생성하게 된다. 2. AuthenticationManager -> AuthenticationProvider 생성된 Authenticatio.. [스프링 시큐리티] 2. Form Login 인증 방식 파악 UsernamePasswordAuthenticationFilter, AnthPathRequestMatcher 1. Form Login formLogin의 API 살펴보기 http.formLogin() 으로 작동시킬 수 있다. 그리고 chaining 방식으로 아래와 같이 상황에 따른 페이지 설정을 해줄 수 있다. http.formLogin() .loginPage(“/login.html") // 사용자 정의 로그인 페이지 .defaultSuccessUrl("/home) // 로그인 성공 후 이동 페이지 .failureUrl("/login.html?error=true“) // 로그인 실패 후 이동 페이지 .usernameParameter("username") // 아이디 파라미터명 설정 .passwordParameter(“password”) // 패스워드 파라미터명 설정 .loginProcessingUrl(“/log.. 이전 1 2 3 4 다음