개인 프로젝트

Spring security 의존성 추가하고....

오마이냥 2024. 7. 21. 21:53

Spring security 의존성을 추가하고 아래의 메시지가 출력되기 시작했다..... 뭔데

Using generated security password: 58464e95-f5ae-42b2-9076-9489

This generated password is for development use only. Your security configuration must be updated before running your application in production.

 

  • 서버가 기동되면 스프링 스큐리티의 초기화 작업 및 보안 설정이 이루어진다.
  • 별도의 보안 설정, 구현을 하지 않아고 스프링 부트는 기본 필터를 적용하고, 모든 엔드포인트에 보안 기능이 적용된다.
    • 모든 요청은 인증이 되어야 자원에 접근이 가능하다.
    • 인증 방식으로는 Form 로그인 방식, HttpBasic 로그인 방식이 지원된다.
    • 기본 로그인 페이지가 제공된다.
    • 기본 계정이 하나 제공된다. (username: user / password: 콘설에 출력되는 랜덤 문자열, 58464e95-f5ae-42b2-9076-9489 가 password에 해당)
  • 웹 브라우저를 통해 루트 페이지로 접근하면, /login 으로 리다이렉트 된다. (나는 이미 /login 페이지를 만듦)

 

참고: https://ttasjwi.tistory.com/148

 

[Spring Security] 스프링부트 시큐리티 의존성 추가로 일어나는 일들

dependencies { // spring security implementation("org.springframework.boot:spring-boot-starter-security") testImplementation("org.springframework.security:spring-security-test") } gradle의 경우 buiild.gradle 또는 build.gradle.kts maven의 경우 pom.x

ttasjwi.tistory.com

 

참고: https://docs.spring.io/spring-security/reference/servlet/getting-started.html#servlet-hello-auto-configuration

 

Hello Spring Security :: Spring Security

Running Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336 ... $ ./gradlew :bootRun ... INFO 23689 --- [ re

docs.spring.io

 

그리고 Spring security 공식문서를 참조해 아래 코드를 추가했더니 더이상 메시지가 뜨지 않았다.

@EnableWebSecurity
@Configuration
public class DefaultSecurityConfig {
    @Bean
    @ConditionalOnMissingBean(UserDetailsService.class)
    InMemoryUserDetailsManager inMemoryUserDetailsManager() {
        String generatedPassword = "sajdklj3483okrldsjfklasdjf";
        return new InMemoryUserDetailsManager(User.withUsername("user")
                .password(generatedPassword).roles("USER").build());
    }

    @Bean
    @ConditionalOnMissingBean(AuthenticationEventPublisher.class)
    DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(ApplicationEventPublisher delegate) {
        return new DefaultAuthenticationEventPublisher(delegate);
    }
}

 

 

다음으로 발생한 오류는 CORS 설정 관련된 것으로 해결하려면 Spring Boot 애플리케이션에 CORS 설정을 추가해야 한다.

 

Spring Framework는 CORS에 대한 일류 지원을 제공한다. CORS는 Spring Security보다 먼저 처리되어야 한다. 사전 비행 요청에 쿠키가 없기 때문이다(JSESSIONID). 요청에 쿠키가 없고 Spring Security가 먼저인 경우, 요청은 사용자가 인증되지 않았다고 판단하고(요청에 쿠키가 없기 때문) 거부한다.

 

CORS 설정은 Spring Security 구성 전에 처리되어야 하므로, Spring Security와 통합된 형태로 설정 파일을 작성하는 것이 좋다. 

 

CORS가 먼저 처리되도록 하는 가장 쉬운 방법은 CorsFilter를 사용하는 것이다. 사용자는 CorsConfigurationSource를 사용해 CorsFilter을 Spring Security와 통합할 수 있다. 

 

//공식문서
@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

//실제적용
@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("https://localhost:3000"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST", "PUT", "DELETE"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

 

 

Spring MVC의 CORS 지원을 사용하는 경우 CORS 지정을 생략할 수 있으며

CorsConfigurationSource Spring Security는 Spring MVC에 제공된 CORS 구성을 사용한다.

 

//공식문서
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        // if Spring MVC is on classpath and no CorsConfigurationSource is provided,
        // Spring Security will use CORS configuration provided to Spring MVC
        .cors(withDefaults())
        ...
    return http.build();
}

 

securityFilterChain 메서드는 Spring Security 설정에서 보안 필터 체인을 정의하는 데 사용된다. 이 메서드는 HttpSecurity 객체를 사용해 다양한 보안 설정을 구성한다. 

  1. http.cors().and()
    1. CORS(Cross-Origin Resource Sharing)를 활성화한다.  CORS는 다른 출처에서 온 웹 페이지의 요청을 허용할지 결정한다. http.cors() 를 사용하면 Spring Security가 CORS 설정을 처리한다.
    2. .and()는 다음 설정을 이어서 정의할 수 있도록 한다.
  2. http.csrf().disable()
    1. CSRF(Cross-Site Request Forgery) 보호를 비활성화한다. CSRF는 웹 애플리케이션에서 신뢰할 수 없는 출처의 요청으로부터 사용자를 보호하는 기능이다. 보안 이유로 CSRF 보호를 기본적으로 활성화하는 것이 좋지만, API 서버 등에서는 비활성화할 수도 있다.
    2. JWT 토큰을 사용한다면 CSRF를 끄자!!!!
  3. http.authorizeRequests(authorizeRequests ->
    1. 요청(authorizeRequests)을 인증 및 인가하는 설정을 시작한다. 이 설정을 통해 어떤 요청이 허용되거나 거부될지 정의할 수 있다.
  4. .antMatchers("/public/**").permitAll()
    1. 특정 경로 패턴에 대해 접근을 허용한다. 여기서는 /public/** 경로에 대한 모든 요청을 인증 없이 허용한다. 즉 이 경로로 오는 요청은 누구나 접근할 수 있다.
  5. .anyRequest().authenticated()
    1. 나머지 모든 요청은 인증된 사용자만 접근할 수 있도록 설정한다. 즉 /public/** 경로를 제외한 모든 경로에 대한 요청은 인증이 필요하다.
  6. .formLogin(withDefaults())
    1. 폼 기반 로그인을 활성화한다. 기본 설정을 사용해 로그인 페이지를 구성한다. Spring Security는 기본 로그인 페이지와 로그인 처리 로직을 제공한다.
    2. withDefaults()는 기본 설정을 사용하도록 지정한다.
  7. return http.build()
    1. HttpSecurity 객체의 설정을 완료하고, 보안 필터 체인을 빌드하여 반환한다.

 

 

Spring Security와 함께 사용하기 위해 SecurityFilterChain을 사용해 보안을 설정해보았다.