본문 바로가기
Framework/Spring

[Spring / ToyProject] Spring Security 설정 - 1

by wo__ongii 2025. 1. 8.
728x90

build.gradle 내 dependencies 추가

implementation 'org.springframework.boot:spring-boot-starter-security'

 

WebSecurityConfig.java

 

1) SecurityFilterChain : 특정 Http 요청에 대해 웹 기반 보안 구성. 인증/인가 및 로그아웃을 설정

@Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .csrf(AbstractHttpConfigurer::disable)
                .cors((cors) -> cors.configurationSource(corsConfigurationSource()))
                .httpBasic(AbstractHttpConfigurer::disable)
                .formLogin(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests((authorize) -> authorize
                        .requestMatchers("/", "/movie/**")
                        .permitAll()
                        .anyRequest().authenticated())
                .exceptionHandling((exception) -> exception
                        .authenticationEntryPoint(unauthorizedEntryPoint).accessDeniedHandler(accessDeniedHandler))
                .logout((logout) -> logout
                        .logoutSuccessUrl("/movie/login")
                        .invalidateHttpSession(true))
                .sessionManagement((session) -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS));

        return httpSecurity.build();
    }
  • csrf() (Cross site Request forgery) : 정상적인 사용자가 의도치 않은 위조 요청 보내는것으로 API 기반 인증에서는 일반적으로 비활성화
  • cors() : 교차 출처 리소스 공유, 출처가 다른 리소스 간의 공유
  • authorizeHttpRequests()
    • requestMatchers() : 특정 요청과 일치하는 url에 대한 access 설정
    • permitAll() : requestMatchers에서 지정된 url 인증,인가 없이도 접근 허용 (ignoing() -> 허락x)
    • anyRequest().authenticatied() : 이 외 모든 요청은 인증이 필요
  • exceptionHandling() : 401, 403 예외처리
  • formLogin() : HTTP Basic 및 기본 제공 폼 로그인 방식. JSON 기반의 커스텀 인증 사용 시 비활성화
  • httpBasic() :  토큰 기반 인증(예: JWT, OAuth 2.0) 사용하는 경우 비활성화
  • logout()
    • logoutSuccessUrl() : 로그아웃 시 리다이렉트될 주소
    • invalidateHttpSession() : 세션에 저장된 모든 데이터 삭제 여부 설정(true 시 저장된 모든 데이터 삭제되며 현재 세션을 완전히 무효화시킴)
  • sessionManagement()
    • sessionCreationPolicy(SessionCreationPolicy.STATELESS)) : HTTP 세션을 사용하지 않도록 설정하는 역할. RESTful API와 같은 상태 없는(stateless) 인증 방식에서 사용. JWT(JSON Web Token) 또는 다른 토큰 기반 인증 방식을 사용할 때 주로 사용되며, 서버는 상태를 저장하지 않고, 클라이언트가 제공하는 토큰을 통해 인증을 처리한다.

2) corsConfigurationSource() : 교차 출처 리소스 공유위해 cors 설정

@Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration(); // 허용할 origin 설정
        config.addAllowedOrigin("http://localhost:3000");
        config.setAllowCredentials(true); // 쿠키 허용
        config.addAllowedHeader("*"); // 모든 헤더 허용
        config.addAllowedMethod("*"); // 모든 http 메소드 허용

        /*
         * config.setExposedHeaders(Arrays.asList("Access-Control-Allow-Headers",
         * "Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, "
         * ,
         * "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"
         * )); // 헤더 요청 열어둠
         */
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config); // 모든 경로에 대해 위 설정 적용

        return source;
    }

 

3) exceptionHandler 설정

// 401 Unauthorized 응답을 반환
    private final AuthenticationEntryPoint unauthorizedEntryPoint = (request, response, authException) -> {
        ErrorResponse fail = new ErrorResponse(HttpStatus.UNAUTHORIZED, "Spring security unauthorized...");
        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        String json = new ObjectMapper().writeValueAsString(fail);
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        PrintWriter writer = response.getWriter();
        writer.write(json);
        writer.flush();
    };

    // 403 Forbidden 응답을 반환
    private final AccessDeniedHandler accessDeniedHandler = (request, response, accessDeniedException) -> {
        ErrorResponse fail = new ErrorResponse(HttpStatus.FORBIDDEN, "Spring security forbidden...");
        response.setStatus(HttpStatus.FORBIDDEN.value());
        String json = new ObjectMapper().writeValueAsString(fail);
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        PrintWriter writer = response.getWriter();
        writer.write(json);
        writer.flush();
    };
    
    @Getter
    @RequiredArgsConstructor
    public class ErrorResponse {
        private final HttpStatus status;
        private final String message;
    }

[출처: https://velog.io/@woosim34/Spring-Spring-Security-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EA%B5%AC%ED%98%84SessionSpring-boot3.0-%EC%9D%B4%EC%83%81]

 

 

728x90
반응형