SpringSecurity

Psj·2025년 3월 20일
0

F-lab

목록 보기
3/4
@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();
    }
}

✅ 위 코드의 핵심 개념

  1. .httpBasic(http -> http.disable())
  • HTTP Basic 인증을 비활성화 (Authorization: Basic 방식 사용 안 함)
  1. .csrf(csrf -> csrf.disable())
  • CSRF 보호를 비활성화 (REST API에서는 CSRF 보호가 불필요)
  1. .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
  • STATELESS: 세션을 사용하지 않음 (JWT 기반 인증 방식 사용 시 필요)
  1. .authorizeHttpRequests(auth -> auth...)
  • requestMatchers("/api/public/**").permitAll() → 특정 경로는 모든 사용자에게 허용
  • requestMatchers("/api/admin/**").hasRole("ADMIN") → 특정 경로는 ADMIN 권한이 있는 사용자만 접근 가능
    - anyRequest().authenticated() → 그 외의 모든 요청은 인증된 사용자만 허용

@EnableWebSecurity

Spring Security를 활성화하고, 보안 필터(Security Filter Chain)를 설정

📌 @EnableWebSecurity를 사용하지 않으면?

  • Spring Security의 기본 설정이 적용되지 않음.
  • 보안 필터가 등록되지 않아, 인증(Authentication) 및 권한(Authorization) 기능이 동작하지 않음.
  • @EnableWebSecurity 없이 Spring Security 관련 Bean을 등록하면, Spring Boot의 기본 보안 설정을 그대로 사용.

httpBasic() vs formLogin() 차이점

rest api를 사용하려면 httpBasic을 사용해야함

httpBasic(http -> http.disable()) → HTTP Basic 방식의 인증 비활성화

HTTP 기본 인증(Basic Authentication) 방식은 사용자의 아이디와 비밀번호를 Base64로 인코딩하여 Authorization 헤더에 포함시켜 보내기 때문에, 요청을 가로채면 아이디와 비밀번호를 쉽게 볼 수 있다. 또한, 요청 헤더를 수정하는 공격(Header Injection)도 가능하다.

우리는 Http basic 인증이아닌 jwt 인증을 사용할것이기때문에 http.disable()로 비활성해놓는다.

🚀 이제 HTTP 요청에서 Authorization: Basic 헤더를 요구하지 않음!

CSRF (Cross-Site Request Forgery)란?

사용자가 인증된 상태에서 악성 웹사이트를 방문했을 때, 해당 사이트가 사용자의 권한을 이용하여 서버에 요청을 보내는 공격 기법.

예를 들어, 사용자가 은행 사이트에 로그인한 상태에서, 악성 사이트에서 POST /transfer 요청을 보내면 사용자의 계좌에서 돈이 빠져나갈 수도 있음.

✅ CSRF 보호가 필요한 경우 vs 필요 없는 경우

csrf().disable()을 사용하는 이유

  • REST API에서는 JWT 토큰 기반 인증을 사용하며, 서버가 세션을 저장하지 않으므로 CSRF 공격 가능성이 낮음.

✅ SessionCreationPolicy.STATELESS를 사용하는 이유

  • REST API에서는 JWT 토큰을 사용하여 인증하므로, 세션을 사용할 필요가 없음.
  • STATELESS 모드에서는 Spring Security가 세션을 생성하지 않고, 매 요청마다 토큰을 확인하여 인증함.

authorizeHttpRequests(요청 권한 설정)

Spring Security에서 authorizeHttpRequests() 메서드를 사용하면 각 HTTP 요청에 대한 권한을 설정할 수 있습니다.
즉, 어떤 요청은 누구나 접근 가능하게 할지, 어떤 요청은 특정 권한을 가진 사용자만 접근 가능하게 할지 등을 설정할 수 있습니다.

permitAll()의 의미

  • 모든 요청(anyRequest())을 인증 없이 허용(permitAll())
  • 즉, 로그인하지 않은 사용자도 모든 API 엔드포인트를 자유롭게 사용할 수 있음
  • permitAll()을 사용하면 Spring Security가 보안을 적용하지 않음.

authenticated()의 의미

  • 모든 요청(anyRequest())에 대해 로그인한 사용자만 접근 가능 (authenticated())
  • 즉, 인증되지 않은 사용자는 API를 사용할 수 없음.
  • JWT 또는 세션 기반 인증이 필요.

hasRole("USER") vs hasAuthority("ROLE_USER")

Spring Security에서는 특정 권한을 가진 사용자만 API를 사용하도록 설정할 수 있습니다.
권한을 검사하는 방법에는 hasRole()hasAuthority()가 있다.

✅ hasRole("USER")

  • Spring Security에서는 자동으로 "ROLE_" 접두사를 추가하므로, 비교할 실제 데이터베이스에는 ROLE_USER로 저장되어 있어야 한다.
  • 즉, hasRole("USER")는 hasAuthority("ROLE_USER")와 동일한 동작을 함.

✅ hasAuthority("ROLE_USER")

  • hasAuthority("ROLE_USER")는 "ROLE_USER" 권한을 가진 사용자만 접근 가능.
  • hasRole("USER")와 동일한 동작을 하지만, hasAuthority()는 "ROLE_" 접두사를 자동으로 추가하지 않음.

👉 Spring Security의 기본 동작을 따르는 것이 유지보수에 유리하므로,
보통 hasRole("USER")을 사용하고, DB에는 "ROLE_USER"로 저장하는 것이 추천됨. 🚀

profile
Software Developer

0개의 댓글

관련 채용 정보