[팀 프로젝트 (제시요)] Spring Security 설정

프로젝트에 적용한 Security 설정 내용
화낼거양's avatar
Dec 18, 2024
[팀 프로젝트 (제시요)] Spring Security 설정
 
 

설정 파일 내용 :

 
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

moohyun