오늘은 Spring Security 설정 방법에 대해 작성하려 합니다. 🙃
현재 프로젝트 개발 환경은 아래와 같습니다.
- **Language** : Java 17
- **Framework** : Springboot (3.2.5)
- **Database** : MariaDB
- **ORM** : JPA
- **Frontend**: Thymeleaf
- **Build**: Gradle
1. 프로젝트 초기 설정
Gradle을 사용하여 필요한 의존성을 추가합니다.
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'
}
implementation 'org.springframework.boot:spring-boot-starter-security'
: Spring Security를 사용할 수 있도록 하는 기본적인 의존성으로, Spring Security의 핵심 기능들을 포함합니다.
testImplementation 'org.springframework.security:spring-security-test'
: Spring Security 테스트 도구를 사용하기 위한 의존성으로, Spring Security와 관련된 테스트를 쉽게 작성할 수 있도록 도와줍니다.
버전은 spring-security-config-6.2.4으로 적용되었습니다.
위와 같이 설정하고 서버를 재시작하면 아래와 같이 접속됩니다.
아직 아무런 추가 설정을 하지 않았기 때문에 Username에는 'user'
Password에는 서버 Console에 나와있는 password를 입력하면 됩니다.
입력 후 Sign in을 통해 로그인하면 아직 아무런 설정을 하지 않았기에, 어떠한 경로에도 다 접근이 가능합니다.
2. Spring Security 설정
SecurityConfig 클래스 파일을 생성합니다.
Spring Boot 3.0 이전 버전에서는 아래와 같이 WebSecurityConfigurerAdapter를 주로 사용하였는데
Spring Boot 3.0부터는 WebSecurityConfigurerAdapter가 더 이상 사용되지 않습니다. 대신 SecurityFilterChain을 사용하는 새로운 방식으로 전환되었습니다.
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
SecurityConfig.java 예시
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
/* 커스텀 로그인 페이지를 설정합니다. "/login" 페이지는 누구나 접근할 수 있도록 허용합니다.
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)*/
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/sign-in/**", "/", "/sign-up/**",
"/api/sign-in/**").permitAll()
.anyRequest().authenticated()
)
.logout((logout) -> logout
.logoutSuccessUrl("/")
.invalidateHttpSession(true))
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);
return http.build();
}
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
설명
@Configuration
이 어노테이션은 해당 클래스를 Spring의 설정 클래스(Configuration Class)로 지정합니다.
@Bean 어노테이션을 사용하여 Bean을 정의하고 이를 Spring 컨테이너에서 관리할 수 있도록 합니다.
@EnableWebSecurity
이 어노테이션은 Spring Security를 활성화하여 설정을 정의할 수 있도록 합니다. 내부적으로 SpringSecurityFilterChain이 동작하여 URL 필터가 적용됩니다.
securityFilterChain 메서드
Spring Security의 필터 체인을 정의하는 Bean으로, HttpSecurity를 사용하여 다양한 보안 설정을 구성합니다.
HttpSecurity 설정
csrf(AbstractHttpConfigurer::disable): CSRF(Cross-Site Request Forgery) 보호 기능을 비활성화합니다.
httpBasic(AbstractHttpConfigurer::disable): HTTP Basic 인증을 비활성화합니다.
formLogin(AbstractHttpConfigurer::disable): 폼 기반 인증을 비활성화합니다.
authorizeHttpRequests(authorize -> authorize
.requestMatchers(...).permitAll(): 특정 경로에 대한 접근을 인증 없이 허용합니다.
.anyRequest().authenticated(): 그 외 모든 요청에 대해서는 인증을 요구합니다.
logout((logout) -> logout.logoutSuccessUrl(”/”).invalidateHttpSession(true)):
로그아웃 설정을 정의 -> 로그아웃 성공 후 리다이렉트될 URL을 /로 설정하고, 세션을 무효화합니다. (true)
sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)):
세션 관리 정책을 STATELESS로 설정하고, 이를 통해 서버가 세션을 생성하거나 유지하지 않게 합니다.
bCryptPasswordEncoder 메서드
BCryptPasswordEncoder를 Bean으로 정의하는 메서드로, 비밀번호를 BCrypt 해시 함수로 암호화하는 데 사용됩니다.
BCryptPasswordEncoder: Spring Security에서 비밀번호를 안전하게 저장하기 위해 사용하는 암호화 클래스입니다.
'Framework > Spring' 카테고리의 다른 글
[Spring] Jasypt란? Spring Boot 설정 파일 암호화 적용 방법 (1) | 2024.07.05 |
---|---|
[Spring] RESTful API 컨트롤러의 @GetMapping 에서 데이터를 받는 방법 (0) | 2024.07.03 |
[Spring] Spring Boot 기본, 자주 사용하는 어노테이션 (애너테이션) (0) | 2024.07.02 |
[Spring Boot] application.yml이란? application.yml 설정 방법 (0) | 2024.06.29 |
[Spring Boot] application.properties와 application.yml 차이 (0) | 2024.06.29 |