본문 바로가기

스프링 부트/시큐리티5

[스프링 시큐리티] 주요 Security Filter들 정리 ChannelProcessingFilter 전송 레이어 보안을 위해 SSL(TLS) 인증서를 생성하고 어플리케이션에 저장한다. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; FilterInvocation filterInvocation = new FilterInvocation(request, response, chain); Collection a.. 2022. 5. 24.
[스프링 시큐리티] FilterChainProxy 스프링은 많은 필터들을 제공하는데 그 중에서도 DelegatingFilterProxy가 시큐리티 필터를 제공한다. FilterChainProxy Spring Security의 구현은 서블릿 필터 (javax.servlet.Filter 인터페이스 구현체) 를 통해 이뤄진다. WebSecurityConfigurerAdapter라는 추상 클래스를 상속받는 구현체에서 설정할 수 있다.(@EnableWebSecurity 함께 사용) 그 구현체가 바로 DelegatingFilterProxy이 되는 것이다. SecurityFilterAutoConfiguration 클래스에서 DelegatingFilterProxy를 빈으로 자동 등록시킨다. @Bean @ConditionalOnBean(name = DEFAULT_FIL.. 2022. 5. 23.
[스프링 시큐리티] SecurityContextHolder SecurityContextHolder ThreadLocal을 기반으로 동작한다.WAS는 ThradPool을 생성한다. 요청이 들어오면 큐에 적재되고 특정 쓰레드가 큐에서 요청을 가져와 처리한다. HTTP 요청은 처음과 끝이 동일한 쓰레드에서 처리된다. 다 사용된 쓰레드는 반납처리 된다. 최대 동시 처리 요청 개수는 ThreadPool의 개수와 같다. 개수가 늘리면 동시 처리가 늘어나지면 Thread Context Switching에 의한 오버헤드 또한 커지기에 성능이 선형적으로 증가하진 않는다. -> WebFlux 같은 기술로 Thread 개수를 작게 유지하면서 요청을 동시처리할 수 있다. SecurityContext를 쓰레드와 연결해주는 역할을 한다. SecurityContextHolder를 통해 .. 2022. 5. 23.
[스프링 시큐리티] AuthenticationManager, AccessDecisionManager AuthenticationManager 사용자 인증 관련 처리를 담당한다. 오직 authenticate라는 메소드만 가진다. Authentication는 getAuthorities(), getCredentials(), getPrincipal() 등 인증 정보를 가져올 수 있고 setAuthenticated(boolean)를 통해 인증처리를 할 수 있다. 인증 정보가 유효하다면 UserDetailService에서 return한 객체(principal)을 담고있는 Authentication을 리턴한다. AccessDecisionVoter들의 투표(vote)결과를 취합하고, 접근 승인 여부를 결정하는 3가지 구현체를 제공한다. AffirmativeBased(default) — AccessDecisionVote.. 2022. 5. 23.
[스프링 시큐리티] PasswordEncoder PasswordEncoder 인터페이스는 암호가 안전하게 저장되도록 단방향 변환을 수행해준다. 보통 SHA-256 같은 단방향 해시를 통해 암호를 실행한 후 저장한다. 그러나 레인보우 테이블 같은 조회 테이블때문에 암호의 보안을 더 강화해야 했다. 레인보우 테이블이란 암호화 해시 함수의 출력을 캐싱하기 위해 미리 계산된 테이블을 말한다. 제한된 문자 집합으로 구성된 특정 길이까지 키 파생 함수를 복구하는데 사용된다. 무차별 대입 공격보다 더 적은 처리 시간을 가지지만 많은 저장 공간을 사용한다. 따라서 솔티드 암호가 권장되었다. 비밀번호를 사용하는 대신 임의의 추가 바이트를 덧붙여 해시 함수를 통해 해시를 생성한다. 따라서 레인보우 테이블이 효과적이지 않게 되었다. 스프링은 따라서 각 시스템에 맞는 성능.. 2022. 5. 23.