[TIL] 22.12.26 (Spring Security)

조성현·2022년 12월 26일
1

TIL 요약 (문시해알이 무엇인가요?)

  • 문: Spring Security

  • 시: 스프링 심화강의 Spring Security 개론을 들었다.

  • 해: 단순히 멍때리면서 클론코딩 하는 것이 아니라, 개념적인 부분들을 이해하기 위해 필기하며 열심히! 들었다.

  • 알: Spring Security의 매커니즘, 개념들에 대해 알게 되었다.(아래에서 자세히 기술)


오늘 만난 문제

Spring Security


내가 시도해본 것들 & 어떻게 해결했는가

오늘도 어김없이 등장하는 보안 글씨체와 함께 강의를 정리하며 이해해보았다.

  • ⚠️주의⚠️ 글씨체가 매우 더러우니 필기 내용을 읽으려하지 마세요! plz🙏


무엇을 알게 되었는가

1. Spring Security 적용 및 활성화 방법.

2. FilterChain

(추천 Ref - 스프링 시큐리티 -아키텍처 정리)

Spring Security는 요청이 들어오면 Servlet FilterChain을 자동으로 구성한 후 거치게 한다.
FilterChain -> 여러 Filter를 chain형태로 묶어놓은 것

  • FilterChain을 차근차근 타고 넘어갈 때, filterchain.doFilter(request, response)를 통해 request와 response를 챙겨서 다음 단계로 넘어갈 수 있다.
  • 만약 Exception이 발생하면, FilterChain을 역순으로 타고 올라간다.

Filter

  • 톰캣과 같은 웹 컨테이너에서 관리되는 서블릿의 기술이다.
  • Client 요청이 전달되기 전후의 URL 패턴에 맞는 모든 요청에 필터링을 해준다.
  • CSRF, XSS 등의 보안 검사를 통해 올바른 요청이 아닐 경우 이를 차단해 준다.
  • 따라서 Spring Security는 이런한 기능을 활용하기위해 Filter를 사용하여 인증/인가를 구현하고 있다.

SecurityFilterChain

  • Spring 의 보안 Filter를 결정하는데 사용되는 Filter
  • session, jwt 등의 인증방식들을 사용하는데에 필요한 설정을 완전히 분리할 수 있는 환경을 제공한다.

3. UsernamePasswordAuthenticationFilter

  • AbstractAuthenticationProcessingFilter를 상속한 Filter
  • 기본적으로 Form Login 기반을 사용할 때 username 과 password 확인하여 인증한다.
  • Form Login 기반은 인증이 필요한 URL 요청이 들어왔을 때 인증이 되지 않았다면 로그인페이지를 반환하는 형태
  • 아래 사진은 Authenication 결과에 따라 달라지는 SecurityFilterChain의 흐름/구조

4. SecurityContextHolder

SecurityContextHolder 에는 스프링 시큐리티로 인증을 한 사용자의 상세 정보를 저장한다.

  • Authication에 상세정보를 담고, SecurityContext에 담은 뒤에 SecurityContextHolder라는 포장지로 감싼다.
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
context.setAuthentication(authentication);

SecurityContextHolder.setContext(context);

Authentication

  • principal : 사용자 식별 정보. Username/Password 방식으로 인증할 때, 보통 UserDetails 인스턴스를 담게 된다.
  • credentials : 주로 비밀번호, 대부분 사용자 인증에 사용하고 다음 비운다.
  • authorities : 사용자에게 부여한 권한을 GrantedAuthority 로 추상화하여 사용

5. WebSecurityConfig

@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
public class WebSecurityConfig {

		@Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        // h2-console 사용 및 resources 접근 허용 설정
        return (web) -> web.ignoring()
                .requestMatchers(PathRequest.toH2Console())
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations());
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // CSRF 설정
        http.csrf().disable();
        
        http.authorizeRequests().anyRequest().authenticated();

        // Custom 로그인 페이지 사용
        http.formLogin().loginPage("/api/user/login-page").permitAll();
        
        return http.build();
    }

}

WebSecurityCustomizer()

  • SecurityFilterChain보다 먼저 실행되는 커스텀필터
  • ignoring()으로 필터 적용을 제외시킬 수 있다.(관련 Ref)

SecurityFilterChain

  • http.authorizeRequests().antMatchers(HTTP메소드, URI)를 활용하여 .PermitAll(), authenticated()등등 설정 가능
  • http.formLogin().loginPage("/api/user/login-page").permitAll();를 통해 커스텀 로그인 페이지를 사용할 수 있다.
  • http.formLogin()으로만 설정해두면 기본 로그인페이지를 만날 수 있다.

6. UserDetails, UserDetailsService Custom

  • UserDetails, UserDetailsService 인터페이스를 상속받아 @Override하는 방식으로 Custom할 수 있다.
  • 이름이 낯설어도 UserDetails -> Entity, Dto 역할 /
    UserDetailsService -> 서비스 역할이라는 점을 기억하면 이해에 도움이 된다.

7. 비밀번호 암호화

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

2개의 댓글

comment-user-thumbnail
2022년 12월 28일

보안글씨체 보러 왔읍니다.... 치유 되었읍니다...

1개의 답글