configure 작성
스프링 시큐리티 구성 파일을 나타내며 다음과 같은 기능을 수행합니다:
PasswordEncoder 빈 설정
- 비밀번호 인코딩을 위한 BCryptPasswordEncoder를 빈으로 등록합니다.
CorsConfigurationSource 빈 설정
- CORS(Cross-Origin Resource Sharing) 설정을 구성하여 특정 출처로부터의 요청을 허용합니다.
SecurityFilterConfig 클래스: SecurityConfigurerAdapter를 상속받아 커스텀한 보안 필터 설정을 구성합니다.
- configure(HttpSecurity http) 메서드에서 보안 관련 설정을 수행합니다.
- CSRF 보호를 비활성화하고, CORS 설정을 적용합니다.
- 특정 URL 패턴에 대한 접근 권한을 설정하며, 폼 로그인과 로그아웃 처리 설정을 수행합니다.
package com.example.myproject.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import static org.springframework.security.config.Customizer.withDefaults;
import jakarta.servlet.DispatcherType;
@Configuration
@EnableMethodSecurity
public class SpringSecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public CorsConfigurationSource configurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
List<String> allowOrigins = new ArrayList<String>();
allowOrigins.add("http://localhost:8080");
configuration.setAllowedOrigins(allowOrigins);
configuration.addAllowedMethod("*");
configuration.addAllowedHeader("*");
configuration.setAllowCredentials(true);
configuration.setMaxAge(7200L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.cors().configurationSource(configurationSource()).and()
.cors(withDefaults())
.authorizeHttpRequests(request -> request
.dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll()
.requestMatchers("/main", "/example/**", "/view/join", "/auth/join").permitAll()
.anyRequest().authenticated()
)
.formLogin(login -> login
.loginPage("/login")
.loginProcessingUrl("/login-process")
.usernameParameter("userid")
.passwordParameter("pw")
.defaultSuccessUrl("/view/dashboard", true)
.permitAll()
)
.logout(withDefaults());
return http.build();
}
}
- Access Control Expression
configure(HttpSecurity http) 메서드에서 authorizeRequests()를 사용하여 URL 패턴에 대한 접근 권한을 설정합니다.
- anonymous()
인증되지 않은 사용자가 접근할 수 있습니다. - authenticated()
인증된 사용자만 접근할 수 있습니다. - fullyAuthenticated()
완전히 인증된 사용자만 접근할 수 있습니다(?) - hasRole() or hasAnyRole()
특정 역할을 가지는 사용자만 접근할 수 있습니다. - hasAuthority() or hasAnyAuthority()
특정 권한을 가지는 사용자만 접근할 수 있습니다. - hasIpAddress()
특정 아이피 주소를 가지는 사용자만 접근할 수 있습니다. - access()
SpEL 표현식에 의한 결과에 따라 접근할 수 있습니다. - not() 접근 제한 기능을 해제합니다.
- permitAll() or denyAll()
접근을 전부 허용하거나 제한합니다.
- 로그인 및 로그아웃 설정
.formLogin() 메서드에서 로그인 페이지, 로그인 처리 URL 등을 설정합니다. 만약 커스텀 로그인 페이지를 사용하려면 .loginPage() 메서드를 사용하여 해당 URL을 지정하고, .loginProcessingUrl() 메서드를 사용하여 로그인 처리 URL을 지정합니다.
- 세션 관리 설정
.sessionManagement()을 사용하여 세션 관리 설정을 구성할 수 있습니다. .sessionFixation()을 사용하여 세션 고정 공격(Fixation Attack) 방어 설정을 구성, 세션 정책 설정, 동시 세션 관리 등을 구성할 수 있습니다.
- Remember Me 기능 설정
.rememberMe() 메서드를 사용하여 Remember Me 기능을 구성할 수 있습니다. 사용자의 로그인 정보를 기억하고 자동으로 로그인할 수 있게 하는 기능입니다.
- 접근 거부 및 예외 처리
.exceptionHandling()을 사용하여 접근 거부나 예외 발생 시 처리 방법을 설정할 수 있습니다. 커스텀 접근 거부 핸들러나 예외 핸들러를 등록할 수 있습니다.
- HTTP 보안 헤더 설정
.headers()를 사용하여 HTTP 보안 헤더 설정을 구성할 수 있습니다. 예를 들어 X-Content-Type-Options, X-Frame-Options, Content-Security-Policy 등의 헤더를 설정할 수 있습니다.
*기본 함수
- disable
.disable()을 호출하면 해당 설정이 사용되지 않고 비활성화됩니다. 이를 통해 필요한 기능만 활성화하거나 필요하지 않은 기능을 제거할 수 있습니다.
예를 들어, .csrf().disable()을 사용하면 CSRF(Cross-Site Request Forgery) 보호 기능이 비활성화됩니다. 이렇게 하면 애플리케이션에서 CSRF 공격을 방지하는 기능이 사용되지 않게 됩니다.
또 다른 예로 .cors().disable()을 사용하면 CORS(Cross-Origin Resource Sharing) 설정이 비활성화됩니다. 이렇게 하면 애플리케이션이 다른 출처로부터의 요청을 허용하지 않게 됩니다.
- and
http
.authorizeRequests(requests -> requests
.antMatchers("/public").permitAll()
.anyRequest().authenticated()
)
.and() // 이전 메서드 체인과 다음 메서드 체인을 연결
.formLogin(withDefaults());
.and()를 사용하면 이전 메서드 체인의 구성이 끝나고 다음 메서드 체인의 구성을 시작함을 나타냅니다. 이렇게 함으로써 여러 가지 보안 설정을 순차적으로 연결하고 구성할 수 있습니다.
*and를 안쓰는 경우
.cors(withDefaults()) 메서드는 이미 현재 설정 구문을 종료시키기 때문에 .and()를 사용하지 않습니다. 하지만 .cors().configurationSource(corsConfigurationSource()) 메서드 체인은 새로운 설정 구문이기 때문에 .and()를 사용하여 이전 설정과 연결해야 합니다.
- withDefaults
import static org.springframework.security.config.Customizer.withDefaults;
withDefaults()는 스프링 시큐리티에서 제공하는 메서드 중 하나로, 간단하게 일반적인 보안 설정을 적용하기 위해 사용됩니다. 이 메서드는 일반적으로 웹 애플리케이션의 기본적인 보안 설정을 미리 정의된 값으로 쉽게 적용할 수 있도록 도와주는 역할을 합니다.
예를 들어, .formLogin(withDefaults())는 기본적인 폼 로그인 설정을 적용하라는 의미입니다. 이는 사용자의 아이디와 비밀번호를 사용하여 로그인하며, 로그인 성공 시 홈 페이지로 리다이렉트됩니다.
'Backend > spring' 카테고리의 다른 글
비밀번호 암호화/인증 (spring security 계정 생성) (0) | 2023.11.06 |
---|---|
[spring security] 3. UserDetailsService, UserDetails (0) | 2023.08.29 |
[spring security] 1. 의존성 추가, 기본 로그인 페이지 (0) | 2023.08.20 |
spring boot 개발환경 설정(spring initializr) (0) | 2023.08.18 |
[spring] @RequestParam @RequestBody 차이점 (0) | 2023.05.25 |