스터디-Spring 27

[스프링 시큐리티] FilterSecurityIntercepter

AccessDecisionManager를 사용하여 Access Control 또는 예외 처리하는 필터, 대부분의 경우 FilterChainProxy에 제일 마지막 필터로 들어있다. Authorization(인가)를 시도한다 이때 accessDecisionManage.decide메서드를 호출하는데, AccessDeniedException이 발생하면 그전 단계인 ExceptionTranslationFilter에서 예외를 처리한다. private void attemptAuthorization(Object object, Collection attributes, Authentication authenticated) { try { this.accessDecisionManager.decide(authenticated..

스터디-Spring 2022.01.17

[스프링 시큐리티] AccessDecisionManager

public interface AccessDecisionManager { void decide(Authentication authentication, Object object, Collection configAttributes) throws AccessDeniedException, InsufficientAuthenticationException; boolean supports(ConfigAttribute attribute); boolean supports(Class clazz); } Authorization(인가)를 위한, Access Control 결정을 내리는 인터페이스, 구현체 3가지를 기본으로 제공한다. AffirmativeBased: 여러 Voter중에 한명이라도 허용하면 허용, 기본 전략. C..

스터디-Spring 2022.01.13

[스프링 시큐리티] DelegatingFilterProxy와 FilterChainProxy

https://docs.spring.io/spring-security/reference/servlet/architecture.html Architecture :: Spring Security Spring Security’s Servlet support is based on Servlet Filters, so it is helpful to look at the role of Filters generally first. The picture below shows the typical layering of the handlers for a single HTTP request. The client sends a request to the appl docs.spring.io 서블릿에는 Filter가 존재함, 특정..

스터디-Spring 2022.01.13

[스프링 시큐리티] Filter와 FilterChainProxy

FilterChainProxy는 SecurityFilterChain 인스턴스로 구성되어 있는 리스트를(filterChains) 사용하며, 각 인스턴스에는 RequestMatcher와 일치하는 요청에 적용해야하는 필터 목록이 포함되어 있다 FormLogin, BasicLogin 설정시 아래와 같다. WebAsyncManagerIntergrationFilter SecurityContextPersistenceFilter HeaderWriterFilter CsrfFilter LogoutFilter UsernamePasswordAuthenticationFilter(formlogin) DefaultLoginPageGeneratingFilter(formlogin) DefaultLogoutPageGeneratingFi..

스터디-Spring 2022.01.12

[스프링 시큐리티] Authentication과 SecurityContextHolder

AuthenticationManager가 인증을 마친 뒤 리턴 받은 Authentication 객체는? SecurityContextPersistenceFilter -> CsrfFilter -> LogoutFilter -> AbstractAuthenticationProcessingFilter-> UsernamePasswordAuthenticationFilter SecurityContextPersistenceFilter SecurityContext를 HTTP session에서 캐시(기본 전략)하여 여러 요청에서 Authentication을 공유하는 필터 SecurityContextRepository를 교체하여 세션을 HTTP session이 아닌 다른 곳에 저장하는 것도 가능 UsernamePasswordA..

스터디-Spring 2022.01.11

[스프링 시큐리티] ThreadLocal

java.lang 패키지에서 제공하는 쓰레드 범위 변수 스코프가 쓰레드 이므로 각 쓰레드 내에서만 공유 같은 쓰레드라면 서로 다른 메서드에서도 사용 가능 SecurityContextHolder의 기본 전략 public class AccountContext { private static final ThreadLocal ACCOUNT_THREAD_LOCAL = new ThreadLocal(); public static void setAccount(Account account) { ACCOUNT_THREAD_LOCAL.set(account); } public static Account getAccount() { return ACCOUNT_THREAD_LOCAL.get(); } }

스터디-Spring 2022.01.10

[스프링 시큐리티] AuthenticationManager와 Authentication

스프링 시큐리티에서 인증(Authentication)은 AuthenticationManager가 한다. Authentication authenticate(Authentication authentication) throws AuthenticationException; 파라미터인 Authentication이 유저가 입력한 id, pw 같은 인증정보를 가지고 있다 AuthenticationManager.authenticate를 통해 인증정보가 유효하다면 Principal를 담고있는 Authentication 객체를 리턴한다 계정이 비활성화 되어있다면 - DisabledException 계정이 잠겨있다면 - LockedException 인증정보가 잘못되었다면 - BadCredentialsException 기본적..

스터디-Spring 2022.01.10

[스프링 시큐리티] 스프링 시큐리티 테스트 - Form Login

폼 로그인 / 로그아웃 테스트 (SecurityMockMvcRequestBuilders) perform(formLogin()) perform(formLogin().user("admin").password("123")) perform(logout()) @Test @Transactional public void login_success() throws Exception { String username = "twlee"; String password = "123"; Account user = createUser(username, password); mockMvc.perform(formLogin().user(user.getUsername()).password(password)) .andExpect(authent..

스터디-Spring 2022.01.09

[스프링 시큐리티] 스프링 시큐리티 테스트 - RequestPostProcessor, Annotations

기존의 불편한 수동테스트 직접 파라미터를 통한 가입 - 로그인 - 조회로 테스트 반복되는 수동 단위 테스트에 불필요한 시간 소모가 큼 pom.xml org.springframework.security spring-security-test test ${spring-security.version} spring-security version을 따라가게끔 설정 SecurityMockMvcRequestPostProcessors를 이용한 테스트 방법 @ExtendWith(SpringExtension.class) @SpringBootTest @AutoConfigureMockMvc public class AccountControllerTest { @Autowired MockMvc mockMvc; @Test public..

스터디-Spring 2022.01.09