sm 기술 블로그
[스프링 시큐리티] 설치 및 설정 본문
Spring Security
Spring Security는 Spring기반 애플리케이션을 보호하기 위한 표준으로 직접 커스텀이 가능한 인증 및 Access Control 프레임워크이다.
이는 Java 애플리케이션에 인증과 인가(권한 부여)를 모두 제공하는 데 중점을 뒀다.
Spring Security는 다른 Spring프로젝트와 마찬가지로 사용자 요구에 맞춰 쉽게 확장할 수 있다는 점이 최대 장점이다.
요약 하면 직접 커스텀이 가능한 인증 프레임 워크이다.
gradle에 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
시큐리티를 설치하게 되면 무조건 로그인이 필요하며 아래와 같은 화면이 표시될 것이다.
로그인 없이도 조회 가능 (설정)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/**").permitAll()
;
return http.build();
}
}
- @Configuration : 스프링의 환경설정 파일임을 의미하는 어노테이션
- @EnableWebSecurity : 모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션
- @Bean : 어노테이션은 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려고 할 때 사용된다.
- Bean : Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다. (ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미)
- 이 빈은 응용 프로그램 내의 모든 보안(애플리케이션 URL 보호, 제출된 사용자 이름 및 암호 validation, 로그인 양식으로 리디렉션 등)을 담당한다.
- authorizeRequests()는 시큐리티 처리에 HttpServletRequest를 이용한다는 것을 의미
- antMatchers()는 특정한 경로를 지정
- permitAll()는 모든 사용자가 접근할 수 있다는 것을 의미
- 따라서 http.authorizeRequests().antMatchers("/**").permitAll()은 HttpServletRequest를 이용하고, 모든 경로를 모든 사용자가 접근할 수 있다는 것을 의미한다.
SecurityFilterChain
SecurityFilterChain의 구조는 아래와 같다.
SecurityContextPersistenceFilter
요청(request)전에, SecurityContextRepository에서 받아온 정보를 SecurityContextHolder에 주입
LogoutFilter
주체(Principal)의 로그아웃을 진행한다. (주체는 보통 유저를 말함)
UsernamePasswordAuthenticationFilter
(로그인) 인증 과정을 진행.
인증 성공 시 얻은 인증 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
인증 실패 시 AuthenticationFailureHandler 실행
DefaultLoginPageGeneratingFilter
사용자가 별도의 로그인 페이지를 구현하지 않은 경우, 스프링에서 기본적으로 설정한 로그인 페이지를 처리.
BasicAuthenticationFilter
HTTP 요청의 (BASIC)인증 헤더를 처리하여 결과를 SecurityContextHolder에 저장한다.
RememberMeAuthenticationFilter
SecurityContext에 인증(Authentication) 객체가 있는지 확인하고RememberMeServices를 구현한 객체의 요청이 있을 경우, Remember-Me(ex 사용자가 바로 로그인을 하기 위해서 저장 한 아이디와 패스워드)를 인증 토큰으로 컨텍스트에 주입한다.
SecurityContextHolderAwareRequestFilter
HttpServletRequestWrapper를 상속한SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다. SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공한다.
AnonymousAuthenticationFilter
SecurityContextHolder에 인증(Authentication) 객체가 있는지 확인하고, 필요한 경우 Authentication 객체를 주입한다.
SessionManagementFilter
요청이 시작된 이 후 인증된 사용자 인지 확인하고, 인증된 사용자일 경우SessionAuthenticationStrategy를 호출하여 세션 고정 보호 메커니즘을 활성화하거나 여러 동시 로그인을 확인하는 것과 같은 세션 관련 활동을 수행한다.
ExceptionTranslationFilter
필터 체인 내에서 발생(Throw)되는 모든 예외(AccessDeniedException, AuthenticationException)를 처리한다.
FilterSecurityInterceptor
HTTP 리소스의 보안 처리를 수행한다.
'스프링부트' 카테고리의 다른 글
[스프링 시큐리티] 회원가입 (0) | 2022.07.23 |
---|---|
[스프링 시큐리티] CSRF(cross site request forgery) (0) | 2022.07.23 |
[스프링부트] ID와 GeneratedValue (0) | 2022.07.17 |
[스프링부트] @JsonIgnore (0) | 2022.07.17 |
[스프링부트] HttpServletRequest, HttpServletResponse (0) | 2022.07.17 |