@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
return httpSecurity
.httpBasic(http -> http.disable()) // HTTP Basic 인증 비활성화
.csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 세션 사용 안 함 (JWT 기반 인증)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll() // 특정 경로는 인증 없이 접근 가능
.requestMatchers("/api/admin/**").hasRole("ADMIN") // ADMIN 권한 필요
.anyRequest().authenticated() // 나머지 모든 요청은 인증 필요
)
.build();
}
}
✅ 위 코드의 핵심 개념
.httpBasic(http -> http.disable())
.csrf(csrf -> csrf.disable())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
STATELESS
: 세션을 사용하지 않음 (JWT 기반 인증 방식 사용 시 필요).authorizeHttpRequests(auth -> auth...)
requestMatchers("/api/public/**").permitAll()
→ 특정 경로는 모든 사용자에게 허용requestMatchers("/api/admin/**").hasRole("ADMIN")
→ 특정 경로는 ADMIN 권한이 있는 사용자만 접근 가능 anyRequest().authenticated()
→ 그 외의 모든 요청은 인증된 사용자만 허용Spring Security를 활성화하고, 보안 필터(Security Filter Chain)를 설정
📌 @EnableWebSecurity를 사용하지 않으면?
- Spring Security의 기본 설정이 적용되지 않음.
- 보안 필터가 등록되지 않아, 인증(Authentication) 및 권한(Authorization) 기능이 동작하지 않음.
@EnableWebSecurity
없이 Spring Security 관련 Bean을 등록하면, Spring Boot의 기본 보안 설정을 그대로 사용.
rest api를 사용하려면 httpBasic을 사용해야함
HTTP 기본 인증(Basic Authentication) 방식은 사용자의 아이디와 비밀번호를 Base64로 인코딩하여 Authorization 헤더에 포함시켜 보내기 때문에, 요청을 가로채면 아이디와 비밀번호를 쉽게 볼 수 있다. 또한, 요청 헤더를 수정하는 공격(Header Injection)도 가능하다.
우리는 Http basic 인증이아닌 jwt 인증을 사용할것이기때문에
http.disable()
로 비활성해놓는다.🚀 이제 HTTP 요청에서
Authorization: Basic
헤더를 요구하지 않음!
사용자가 인증된 상태에서 악성 웹사이트를 방문했을 때, 해당 사이트가 사용자의 권한을 이용하여 서버에 요청을 보내는 공격 기법.
예를 들어, 사용자가 은행 사이트에 로그인한 상태에서, 악성 사이트에서
POST /transfer
요청을 보내면 사용자의 계좌에서 돈이 빠져나갈 수도 있음.
✅ CSRF 보호가 필요한 경우 vs 필요 없는 경우
✅ csrf().disable()
을 사용하는 이유
- REST API에서는 JWT 토큰을 사용하여 인증하므로, 세션을 사용할 필요가 없음.
STATELESS
모드에서는 Spring Security가 세션을 생성하지 않고, 매 요청마다 토큰을 확인하여 인증함.
Spring Security에서
authorizeHttpRequests()
메서드를 사용하면 각 HTTP 요청에 대한 권한을 설정할 수 있습니다.
즉, 어떤 요청은 누구나 접근 가능하게 할지, 어떤 요청은 특정 권한을 가진 사용자만 접근 가능하게 할지 등을 설정할 수 있습니다.
✅ permitAll()
의 의미
permitAll()
)✅ authenticated()
의 의미
authenticated()
)Spring Security에서는 특정 권한을 가진 사용자만 API를 사용하도록 설정할 수 있습니다.
권한을 검사하는 방법에는hasRole()
과hasAuthority()
가 있다.
✅ hasRole("USER")
ROLE_USER
로 저장되어 있어야 한다.✅ hasAuthority("ROLE_USER")
👉 Spring Security의 기본 동작을 따르는 것이 유지보수에 유리하므로,
보통 hasRole("USER")을 사용하고, DB에는 "ROLE_USER"로 저장하는 것이 추천됨. 🚀