설정 파일 내용 :
package com.metacoding.web_project._core.config;
import com.metacoding.web_project.user.User;
import jakarta.servlet.http.HttpSession;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable);
http.headers(headers -> headers
.frameOptions(frameOptions -> frameOptions.sameOrigin())
);
http.authorizeHttpRequests(r -> {
r.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/s/**").hasAnyRole("USER", "ADMIN")
.anyRequest().permitAll();
}).formLogin(f -> f.loginPage("/login-form")
.loginProcessingUrl("/login")
.successHandler((request, response, authentication) -> {
User user = (User) authentication.getPrincipal();
HttpSession session = request.getSession();
session.setAttribute("sessionUser", user);
response.sendRedirect("/");
})
.failureHandler((request, response, exception) -> {
response.sendRedirect("/login-form?error=true");
}))
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
);
return http.build();
}
}
주요 설정 설명
클래스 선언 및 어노테이션:
@Configuration
public class SecurityConfig {
- @Configuration: 이 클래스가 Spring의 설정 클래스임을 나타냅니다.
비밀번호 암호화 설정:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
- PasswordEncoder Bean: 비밀번호를 암호화하기 위해
BCryptPasswordEncoder
를 Bean으로 등록합니다.
보안 필터 체인 설정:
@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
- SecurityFilterChain Bean: HTTP 보안 구성을 정의하는 메서드입니다.
CSRF 보호 비활성화:
http.csrf(AbstractHttpConfigurer::disable);
- CSRF 보호 비활성화: CSRF(Cross-Site Request Forgery) 보호를 비활성화합니다.
헤더 설정:
http.headers(headers -> headers .frameOptions(frameOptions -> frameOptions.sameOrigin()) );
- Frame Options 설정: 동일 출처에서만 프레임을 허용하도록 설정합니다. 이를 통해 Clickjacking 공격을 방지합니다.
요청 권한 설정:
http.authorizeHttpRequests(r -> {
r.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/s/**").hasAnyRole("USER", "ADMIN")
.anyRequest().permitAll();
});
- 요청 권한 설정: 특정 URL 패턴에 대한 권한을 설정합니다.
/admin/**
: ADMIN 역할이 있는 사용자만 접근 가능./s/**
: USER 또는 ADMIN 역할이 있는 사용자만 접근 가능.- 기타 모든 요청은 접근 허용.
로그인 설정:
.formLogin(f -> f.loginPage("/login-form")
.loginProcessingUrl("/login")
.successHandler((request, response, authentication) -> {
User user = (User) authentication.getPrincipal();
HttpSession session = request.getSession();
session.setAttribute("sessionUser", user);
response.sendRedirect("/");
})
.failureHandler((request, response, exception) -> {
response.sendRedirect("/login-form?error=true");
}))
- 로그인 설정:
loginPage("/login-form")
: 사용자 정의 로그인 페이지 경로.loginProcessingUrl("/login")
: 로그인 처리 URL.successHandler
: 로그인 성공 시 처리 로직.- 사용자 정보를 세션에 저장하고 홈 페이지로 리디렉션.
failureHandler
: 로그인 실패 시 처리 로직.- 로그인 페이지로 리디렉션하며 오류 메시지 전달.
로그아웃 설정:
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
);
- 로그아웃 설정:
logoutUrl("/logout")
: 로그아웃 처리 URL.logoutSuccessUrl("/")
: 로그아웃 성공 시 리디렉션할 URL.invalidateHttpSession(true)
: 세션 무효화.deleteCookies("JSESSIONID")
: JSESSIONID 쿠키 삭제.
보안 필터 체인 빌드:
return http.build();
- 보안 필터 체인 빌드: 위에서 설정한 보안 구성을 적용하여 보안 필터 체인을 빌드합니다.
Share article