스프링 기반의 애플리케이션의 보안을 담당하는 프레임워크이다.
필터 기반으로 동작하기 때문에 스프링 MVC와 분리되어 관리 및 동작한다.
- Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고 이후에 각 요청을 담당하는 Controller로 분배된다. 이때 DispatcherServlet 이전 단계가 필터이다.
- Spring Security는 FilterChainProxy를 통해서 상세로직을 구현하고 있다.

필터(Filter) 란?
웹 애플리케이션에서 관리되는 영역으로 클라이언트에서 오는 요청과 응답에 대해서 최초, 최종 단계에 위치한다.요청과 응답에 정보를 변경하거나 부가적인 기능을 추가할 수 있다. ex) Logging,
seungg8361.tistory.com
build.gradle ▼
implementation 'org.springframework.boot:spring-boot-starter-security'
Spring Security 설정 클래스 ▼
CSRF (Cross-Site Request Forgery) :
- 공격자가 사용자의 인증 정보를 악용하여 사용자가 의도하지 않은 악성 요청을 보낼 수 있도록 하는 공격
- ex) 사용자가 은행 사이트에 로그인한 상태에서 공격자가 만든 악성 웹 페이지를 방문하게 되면, 그 페이지에서 은행 웹사이트로 사용자의 권한을 이용해 악의적인 거래를 발생시킬 수 있다.
- Spring Security에서 기본적으로 제공하는 기능이지만 현재는 비활성화시켜 놓았다.
// 클래스가 하나 이상의 @Bean 메서드를 제공하고, 해당 클래스가 애플리케이션 컨텍스트의 설정 클래스임을 알려줌
@Configuration // 빈을 수동으로 등록
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig{
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
// CSRF 설정, 사용하지 않음
http.csrf((csrf) -> csrf.disable());
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests // 모든 경로를 제한하지 않음
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()// resources 접근 허용 설정
.requestMatchers("/api/user/**").permitAll()
.anyRequest().authenticated()); // 그 외 모든 요청 인증처리
// 로그인 사용 : 인증이 필요한 url이 요청이 들어왔을 때 인증이 되지 않으면 login.html을 반환한다.
http.formLogin((formLogin) ->
// 로그인 View 제공 (GET) : 스프링 시큐리티가 기본적으로 제공하는 로그인 페이지가 아닌 직접 구현한 로그인 페이지 제공
formLogin.loginPage("/api/user/login-page")
// 로그인 처리 (POST) : Controller에 설정된 로그인 페이지가 아님. Controller로 가기전에 처리
.loginProcessingUrl("/api/user/login")
// 로그인 처리 후 성공 시 URL
.defaultSuccessUrl("/")
// 로그인 처리 후 실패 시 URL
.failureUrl("/api/user/login-page?error")
.permitAll());
return http.build();
}
}
Spring Security에서 formLogin을 따로 설정하고 애플리케이션을 실행하면
기본적으로 제공해 주는 로그인 페이지가 나오게 된다.
Username : user
Password : 제공해 주는 비밀번호 입력 (터미널 확인)

- formLogin 기반 인증 : 인증이 필요한 요청이 들어왔을 때, 기본으로 제공하는 로그인 페이지를 보여준다.
- UsernamePasswordAuthenticationFilter : formLogin 기반을 사용할 때 username, password를 확인해서 인증처리하는 필터
- SecurityContextHolder : 인증이 완료된 사용자의 상세 정보를 저장한다. SecurityContext는 접근할 수 있다.

- Principal : 주로 사용자를 식별한다. 일반적으로 UserDetails 인스턴스이다.
- Credentials : 주로 비밀번호, 대부분 사용자 인증에 사용한 후 비운다.
- Authorities : 사용자에게 부여한 권한을 GrantedAuthority로 추상화해서 사용한다.
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(simpleGrantedAuthority);
return authorities;
}
// UsernamePasswordAuthenticationToken 은 인증객체를 만드는데 사용함.
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
이상으로 Spring Security의 간단한 구조를 알아보았습니다. 🖐️🖐️
'🔥스파르타 TIL (Spring)' 카테고리의 다른 글
RestTemplate란? (0) | 2025.02.24 |
---|---|
JWT 활용하기 (2) - 회원 가입, 로그인 기능 만들기 (0) | 2025.02.13 |
필터(Filter) 란? (0) | 2025.02.10 |
JWT 활용하기 (1) (1) | 2025.02.10 |
인증(Authentication)과 인가(Authorization) 란? (0) | 2025.02.09 |