[Section 4] Spring Security 기본

현이·2023년 5월 18일
0

백엔드 부트캠프 TIL

목록 보기
31/37
post-thumbnail

기숙사 창문이 밖에서 잘보여서 간혹 이렇게 포스트잇이나 포스터 붙여서 장난쳐놓은 친구들이 많았다. 너무 귀여워서 볼때마다 행복했던!
Spring Security ... 생각보다 어렵다!!




Spring Security

-인증(Authentication) - 로그인 기능
-인가(Authorization) - API 권한 부여 기능

  • Spring MVC 기반 애플리케이션에 보안 적용(인증, 인가) 해주는 보안 프레임워크
  • 기본 옵션으로 대부분의 보안 요구 사항 만족시킬 수 ⭕
  • 특정 보안 요구 사항 있을 시에도 커스터마이징 용이 & 유연한 확장 가능

Spring Security의 보안 강화 기능

- 다양한 사용자 인증 기능(폼 로그인, 토큰 기반 인증, OAuth2, etc)
- 사용자에 따라 권한 레벨 적용
- 리소스 접근 제어
- 민감한 데이터 암호화
- SSL 적용, 잘 알려진 웹 보안 공격 차단

Spring Security 용어 정리

  • Principal : 주체, 인증완료된 사용자 계정 정보, 작업 수행하는 사용자/디바이스/시스템
  • Authentication : 인증
  • Credential : 인증 위한 신원 증명 정보 (e.g. 패스워드)
  • Authorization : 인가/권한 부여 (반드시 Authentication 이후 수행)
  • Access Control : 접근 제어



Spring Security의 기본 구조(1)

  • SSR(Server-Side Rendering)

  • Spring Security Configuration 적용하면 디폴트 적용말고 우리가 원하는대로 인증방식/페이지 접근 권한 설정 가능

  • config 디렉터리에 SecurityConfiguration 클래스 파일 붙이고 @Configuration 애너테이션 붙이면 Spring Security Configuration 기본 구조 완.

  • 클래스 안에 InMemoryUserDetailsManager의 UserDetails 로 사용자 인증을 위한 계정 정보 메모리에 고정값으로 설정

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
}

-> http 요청에 대한 보안설정 기본 구조

  • 아래 코드처럼 권한 부여할 때는 더 구체적인 URL경로부터 접근 궎나 부여하고 그 다음 덜 구체적인걸로!
authorizeHttpRequests(authorize -> authorize
			.antMatchers("/orders/**").hasRole("ADMIN")
			.antMatchers("/members/my-page").hasRole("USER")
			.antMatchers("/**").permitAll()
);
  • Custom AuthenticationProvicder에서 AuthenticationException아닌 예외 발생할 경우에는 꼭 AuthenticationException rethrow 하도록 코드 작성

구조 정리

  • InMemory User는 애플리케이션 종료와 함께 메모리에서 사라지므로 테스트 환경/ 데모 환경에 쓰임
  • Spring Security 에서는 Credential 암호화해주는 PasswordEncoder 제공 (디폴트- bcrypt 암호화 알고리즘 사용)
  • 패스워드 같은 민감한 정보는 반드시 암호화해서 저장!
    -> 패스워드는 복호화 필요없으므로 단방향 암호화 방식으로 암호화
  • impleGrantedAuthority로 role 베이스 형태의 권한 지정 시에는 'ROLE_'+권한명 형태 로!
  • UserDetails : Spring Security 에서 관리하는 User 정보 관리
    -> UserDetailsService가 load하는 핵심 User 정보를 표현하는 인터페이스
  • User: Spring Security에서 인증 시도하는 주체 Principal: User의 더 구체적인 정보(주로 Username)
  • Custom UserDetailsService : Spring Security가 내부적으로 인증 대신 처리해주는 방식
  • AuthenticationProvider : 클라이언트로부터 받은 인증 정보로 인증된 사용자인지 처리하는 컴포넌트



Spring Security의 웹 요청 처리 흐름

보안이 적용된 웹 요청의 전체 처리 흐름

  • User의 리소스 요청 -> 인증 관리자가 Credential 요청 -> User가 Credential 제공 -> 인증 관리자가 크리덴셜 저장소에서 Credential 조회 -> 유효한 credential 인지 확인 ->
    No : Exception , Yes : 접근 결정 관리자로 이동 -> 적절한 권한 있는지 확인 -> No : Exception, Yes : 리소스 접근

웹 요청에서의 서블릿 필터와 필터 체인의 역할

  • 서블릿 필터(Servlet Filter) : 서블릿 기반 애플리케이션에서 엔드포인트에 요청이 도달하기 전에 중간에서 요청 가로채서 어떤 처리를 할 수 있는 포인트 제공
    -> Java 제공 API, javax.servlet패키지에 인터페이스로 정의
    -> 웹 request 가로채서 전처리 + 처리 끝나고 전달되는 response 후처리 모두 가능

  • 필터 체인(Filter Chain) : 서블릿 필터 연결
    -> 각 서블릿 필터는 doFilter() 메서드 구현해서 필터 체인 형성
    -> 필터들 끝에는 service()HttpServlet
    -> HttpServlet에서 doService()DispatcherServlet
    -> DispatcherServlet에서 전달한 응답으로도 반대 방향으로 서블릿 필터에서 특별한 작업 수행 가능

서블릿 필터의 역할

  • Filter 인터페이스를 구현하는 클래스 : DelegatingFilterProxy, FilterChainProxy

  • DelegatingFilterProxy
    -> 작업 처리 ❌
    -> 서블릿 컨테이너 영역의 필터와 ApplicationContext에 등록된 Bean필터 연결해주는 브리지 역할

  • FilterChainProxy
    -> Filter Chain : Spring Security에서 보안 작업 처리하는 필터의 모음
    -> FilterChainProxy 는 이 필터 사용의 진입점
    -> 여러개의 Filter Chain에서 어떤거 사용할지 결정
    ->가장 먼저 매칭된거 실행, 매칭되는 체인 없으면 디폴트 패턴인 /** 의 필터체인 실행




Filter와 FilterChain 구현

  • FilterRegistrationBean으로 Filter 등록하면 메서드 순서대로 Filter 순서 결정됨!
  • registrationBean.setOrder(순서 숫자); 로 순서 지정 가능!



Spring Security 인증 구성요소 이해

0개의 댓글