스프링 시큐리티는 API가 실행될 때마다 사용자를 인증하는 기능을 제공하는 스프링 기반 보안 프레임워크이다(보안 기능을 모듈화한 개발 도구 모음). 인증(Authentication: 사용자가 누구인지 확인)과 인가(Authorization: 사용자가 무엇을 할 수 있는지 결정)를 담당한다.즉 스프링 시큐리티는 스프링 애플리케이션의 보안을 위해 사용되며, 요청을 처리하기 전에 요청이 안전한지 판단하고 제어하는 역할을 한다. 스프링 시큐리티를 사용하면 개발자가 일일이 보안 로직을 작성하지 않아도 되도록 도와준다.
스프링 시큐리티는 10개 이상의 다양한 필터로 구성된 Security Filter Chain(시큐리티 필터 체인: 보안 처리를 위한 필터들의 연결된 흐름)을 통해 요청을 처리합니다.
필터 체인 작동 방식 간단 예시:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() // 인가(Authorization)를 설정하는 메서드 체인 시작
.anyRequest().authenticated() // 모든 요청은 인증 필요
.and()
.formLogin(); // 로그인 폼 사용
}
}
이 코드는 스프링 시큐리티의 보안 설정을 구성하는 코드입니다. 여기서 http.authorizeRequests()는 요청 인가 정책을 설정하기 시작한다는 뜻이고, anyRequest().authenticated()는 모든 요청은 로그인(인증)이 되어 있어야 한다는 뜻입니다. 마지막으로 formLogin()은 스프링 시큐리티에서 제공하는 기본 로그인 화면을 사용하겠다는 설정입니다.
이 설정에 의해 요청이 들어오면 Security Filter Chain이 작동하며, 인증 여부를 확인하고, 인증이 되지 않은 경우 로그인 화면으로 리다이렉트시킵니다.
이 예시에서 실제 사용되는 필터들
1. SecurityContextPersistenceFilter: 요청 시작 시 사용자 인증 정보를 로드하고, 응답 시 저장합니다.
2. UsernamePasswordAuthenticationFilter: 로그인 요청(POST /login)을 감지하고, 사용자 인증 처리합니다.
3. SessionManagementFilter: 세션을 생성하거나 유효성을 검사합니다.
4. ExceptionTranslationFilter: 인증/인가 중 예외 발생 시 로그인 페이지나 에러 페이지로 전환합니다.
5. FilterSecurityInterceptor: 최종적으로 사용자가 요청한 자원에 접근할 수 있는지(인가) 판단합니다.
이 필터들은 내부적으로 체인처럼 연결되어 있으며, 앞 필터가 다음 필터를 호출하는 구조로 동작합니다. 예를 들어 사용자가 인증되지 않은 상태로 보호된 URL에 접근하면 ExceptionTranslationFilter가 이를 감지하고 로그인 페이지로 리다이렉트합니다.
주요 필터
스프링 시큐리티는 JPA처럼 스프링 위에서 돌아가는 독자적인 문법이나 어노테이션을 가진건가?
-> YES 스프링 시큐리티는 스프링 프레임워크의 일부로, 보안을 위한 설정과 기능을 제공하고 자체적인 어노테이션, 클래스 등 전용 코드와 패턴이 있다. 대부분 이런 설정은 @Congiguration 어노테이션이 붙은 클래스에서 작성한다. ex) SecurityConfig 클래스
스프링 부트는 설정 기반 자동 구성(auto configuration) 프레임워크이기 때문에, 보안정책도 따로 Java Config으로 정의해서 관리할 수 있게 해주는것이다. 그러므로 이 Config 클래스에서 무엇을 보호할지, 로그인은 어떻게 처리할지, 로그아웃은 어떻게 할지 등을 정리할 수 있다.
formLogin()을 쓰면 로그인 폼이 자동 생성되는가?
-> YES
http
.formLogin();
설정으로 /login이라는 기본 경로에 기본 로그인 HTML 폼 페이지가 만들어진다.
입력한 ID/비밀번호는 UsernamePasswordAuthenticationFilter에서 자동으로 처리해준다. 즉, 프론트엔드 코드 없이도 동작하는 임시 로그인 화면을 제공해주는 코드이다.