| 구분 | 인증 (Authentication) | 인가 (Authorization) |
|---|---|---|
| 질문 | "당신은 누구입니까?" (Who are you?) | "당신은 무엇을 할 수 있습니까?" (What can you do?) |
| 목적 | 사용자의 신원을 확인하는 과정 | 신원이 확인된 사용자가 특정 리소스에 접근할 권한이 있는지 확인하는 과정 |
| 결과 | 인증 성공 또는 실패 | 접근 허용 또는 거부 |
| 예시 | • 아이디/비밀번호로 로그인 • 소셜 로그인 • 지문 인식 | • 관리자(ADMIN)만 접근 가능한 페이지 • 사용자(USER)는 자신의 게시글만 수정 가능 |
| 순서 | 항상 인가보다 먼저 수행됨 | 반드시 인증이 성공한 후에 수행됨 |
DispatcherServlet에 도달하기 전에, 여러 개의 보안 필터들이 체인처럼 연결되어 순차적으로 요청을 검사하고 처리합니다.SecurityFilterChain:
DelegatingFilterProxy를 통해 들어온 요청을 처리하는 필터들의 체인입니다.SecurityFilterChain을 Bean으로 등록하여, 애플리케이션의 보안 규칙(URL별 접근 제어, 로그인 방식 등)을 Java 설정 코드로 정의합니다.AuthenticationManager:
AuthenticationManager는 적절한 AuthenticationProvider에게 인증 처리를 위임합니다.AuthenticationProvider:
Authentication 객체를 생성하여 반환합니다.SecurityContextHolder & SecurityContext:
Authentication 객체는 SecurityContext에 저장되고, 이 SecurityContext는 SecurityContextHolder에 보관됩니다.SecurityContextHolder는 ThreadLocal을 사용하여 현재 스레드 내에서 Authentication 객체를 공유합니다. 이를 통해 애플리케이션의 어느 곳에서든 @AuthenticationPrincipal과 같은 어노테이션으로 현재 로그인된 사용자 정보에 쉽게 접근할 수 있습니다.AccessDecisionManager:
SecurityContextHolder에서 Authentication 객체를 꺼내 사용자의 권한을 확인하고, 해당 리소스에 접근할 수 있는지 여부를 결정합니다.SecurityFilterChain)WebSecurityConfigurerAdapter를 상속받거나(Deprecated), SecurityFilterChain을 Bean으로 직접 등록하는 Java 기반의 설정이 표준입니다.@Configuration
@EnableWebSecurity // Spring Security 활성화
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// 1. 인가(Authorization) 규칙 설정
.authorizeHttpRequests(authz -> authz
.requestMatchers("/admin/**").hasRole("ADMIN") // /admin/** 경로는 ADMIN 역할만 접근 가능
.requestMatchers("/my-page").hasAnyRole("USER", "ADMIN") // /my-page는 USER 또는 ADMIN 역할
.requestMatchers("/", "/login", "/signup").permitAll() // /, /login, /signup 경로는 모두 접근 허용
.anyRequest().authenticated() // 그 외 모든 요청은 인증된 사용자만 접근 가능
)
// 2. 폼 로그인(Form Login) 설정
.formLogin(form -> form
.loginPage("/login") // 커스텀 로그인 페이지 경로
.defaultSuccessUrl("/dashboard", true) // 로그인 성공 시 이동할 경로
.permitAll()
)
// 3. 로그아웃(Logout) 설정
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/")
)
// 4. CSRF, CORS 등 기타 보안 설정
.csrf(AbstractHttpConfigurer::disable); // 개발 편의를 위해 CSRF 비활성화 (운영 시 주의)
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
// 비밀번호 암호화를 위한 PasswordEncoder Bean 등록
return new BCryptPasswordEncoder();
}
}
AuthenticationManager가 인증을, AccessDecisionManager가 인가를 총괄하며, 인증된 사용자 정보는 SecurityContextHolder에 저장되어 애플리케이션 전반에서 공유됩니다.SecurityFilterChain을 Bean으로 등록하는 Java 기반의 코드로 이루어지며, 이를 통해 URL별 접근 제어, 로그인/로그아웃 방식 등을 매우 유연하고 상세하게 정의할 수 있습니다.