Backend/spring

[spring security] 2. configure 작성

dddzr 2023. 8. 27. 21:50

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())는 기본적인 폼 로그인 설정을 적용하라는 의미입니다. 이는 사용자의 아이디와 비밀번호를 사용하여 로그인하며, 로그인 성공 시 홈 페이지로 리다이렉트됩니다.