기숙사 창문이 밖에서 잘보여서 간혹 이렇게 포스트잇이나 포스터 붙여서 장난쳐놓은 친구들이 많았다. 너무 귀여워서 볼때마다 행복했던!
Spring Security ... 생각보다 어렵다!!
-
인증(Authentication)
- 로그인 기능
-인가(Authorization)
- API 권한 부여 기능
- 다양한 사용자 인증 기능(폼 로그인, 토큰 기반 인증, OAuth2, etc)
- 사용자에 따라 권한 레벨 적용
- 리소스 접근 제어
- 민감한 데이터 암호화
- SSL 적용, 잘 알려진 웹 보안 공격 차단
Principal
: 주체, 인증완료된 사용자 계정 정보, 작업 수행하는 사용자/디바이스/시스템Authentication
: 인증Credential
: 인증 위한 신원 증명 정보 (e.g. 패스워드)Authorization
: 인가/권한 부여 (반드시 Authentication 이후 수행)Access Control
: 접근 제어SSR(Server-Side Rendering)
Spring Security Configuration 적용하면 디폴트 적용말고 우리가 원하는대로 인증방식/페이지 접근 권한 설정 가능
config 디렉터리에 SecurityConfiguration 클래스 파일 붙이고 @Configuration 애너테이션 붙이면 Spring Security Configuration 기본 구조 완.
클래스 안에 InMemoryUserDetailsManager의 UserDetails 로 사용자 인증을 위한 계정 정보 메모리에 고정값으로 설정
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
}
-> http 요청에 대한 보안설정 기본 구조
authorizeHttpRequests(authorize -> authorize
.antMatchers("/orders/**").hasRole("ADMIN")
.antMatchers("/members/my-page").hasRole("USER")
.antMatchers("/**").permitAll()
);
AuthenticationException
아닌 예외 발생할 경우에는 꼭 AuthenticationException
rethrow 하도록 코드 작성InMemory User
는 애플리케이션 종료와 함께 메모리에서 사라지므로 테스트 환경/ 데모 환경에 쓰임PasswordEncoder
제공 (디폴트- bcrypt 암호화 알고리즘 사용)impleGrantedAuthority
로 role 베이스 형태의 권한 지정 시에는 'ROLE_'+권한명 형태
로!UserDetails
: Spring Security 에서 관리하는 User 정보 관리AuthenticationProvider
: 클라이언트로부터 받은 인증 정보로 인증된 사용자인지 처리하는 컴포넌트서블릿 필터(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에서 어떤거 사용할지 결정
->가장 먼저 매칭된거 실행, 매칭되는 체인 없으면 디폴트 패턴인 /** 의 필터체인 실행