기본 콘텐츠로 건너뛰기

Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기

Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기

AI 생성 이미지: Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기
AI 생성 이미지: Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기

안녕하세요, 개발하는 페럿입니다. 지난 글에서 `WebSecurityConfigurerAdapter`가 제거되고 `SecurityFilterChain` 빈 방식으로 전환된 것을 다뤘습니다.

하지만 설정을 진행하면서 CORS와 CSRF 관련 경고가 다시 나왔습니다. 이번 포스트에서는 Spring Security 6(=Spring Boot 3.x)가 권장하는 방식인 람다식 기반 설정으로 CORS와 CSRF를 어떻게 깔끔하게 처리하는지 단계별로 정리합니다.

1. 🤯 옛날 방식과 경고의 이유

Spring Boot 2.x 시절에는 http.csrf().disable() 같은 메소드 체이닝으로 보안 설정을 빠르게 작성했습니다. 그런데 Spring Security 6에서는 이러한 체이닝 API가 대체되거나 경고가 뜨기 시작했습니다.

// ❌ 2.x 방식: 곧 Deprecated 되거나 이미 경고가 뜰 수 있습니다.
http
    .csrf().disable() // 체이닝 방식
    .cors().disable(); // 체이닝 방식

그 이유는 Spring Security가 함수형, 즉 람다식(Customizer) 기반 구성을 권장하기 때문입니다. .csrf()나 .cors() 같은 설정 메서드가 이제는 람다를 인자로 받아 내부 옵션을 설정하도록 바뀌었습니다.

2. ✨ 최신 스타일: 람다식(Customizer)으로 설정하기

Spring Boot 3.x 환경에서는 HttpSecurity 객체에 대해 .csrf(...)나 .cors(...)를 호출할 때 람다 표현식을 사용해 각 기능을 명확히 정의하는 방식이 표준입니다. 이 패턴이 경고를 없애고 유지보수를 쉽게 해줍니다.

2-1. CSRF (Cross-Site Request Forgery) 설정

토큰 기반 인증을 쓰는 REST API에서는 CSRF를 비활성화하는 경우가 많습니다. 람다식으로 간단히 비활성화하거나, 기본값으로 둬서 활성화 상태를 유지할 수 있습니다.

설정 목표 Spring Boot 3.x (람다식)
CSRF 비활성화 http.csrf(csrf -> csrf.disable())
CSRF 활성화 (기본값) http.csrf(Customizer.withDefaults())

2-2. CORS (Cross-Origin Resource Sharing) 설정

프론트와 API 서버가 분리되어 있을 때 CORS 설정은 필수입니다. 람다식으로 CORS를 끄거나, Customizer.withDefaults()로 활성화한 뒤 별도 Bean에서 규칙을 정의하는 흐름이 일반적입니다.

설정 목표 Spring Boot 3.x (람다식)
CORS 비활성화 http.cors(cors -> cors.disable())
CORS 활성화 (Custom Bean 사용) http.cors(Customizer.withDefaults())

💡 여기서 잠깐!

Customizer.withDefaults()로 CORS를 활성화하면 Spring은 애플리케이션 컨텍스트에서 CorsConfigurationSource 타입의 Bean을 찾아 사용합니다. 허용 도메인이나 허용 메서드 같은 실제 규칙은 그 Bean에서 정의해야 합니다.

3. 🛡️ 최종 SecurityConfig 코드 (CSRF 비활성화 적용)

아래는 람다식 패턴을 적용해 CSRF를 비활성화하고 CORS는 기본값을 사용하는 예제입니다. SecurityFilterChain 빈을 반환하는 최신 방식으로 구성되어 있습니다.

// ✅ Spring Boot 3.x (Spring Security 6) 최신 설정
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // 💡 CSRF 비활성화는 람다식으로 처리!
            .csrf(csrf -> csrf.disable()) 
            
            // 💡 CORS는 기본 설정 사용 (별도 Bean을 통해 규칙 정의 예정)
            .cors(Customizer.withDefaults()) 
            
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/public/**").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(Customizer.withDefaults()); // formLogin도 람다식/Customizer 사용

        return http.build();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

🚀 이 주제, 우리 서비스에 어떻게 적용할까요?

Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기를 실제 서비스와 조직에 녹여보고 싶다면, 현재 아키텍처와 운영 방식을 한 번 점검해 보는 것부터 시작해 보세요. 팀 위키나 기술 블로그, 사내 스터디 주제로도 아주 좋습니다.

이 글이 도움이 됐다면, 비슷한 엔터프라이즈 사례 글들도 함께 살펴보면서 우리 조직에 맞는 운영 상용구를 정의해 보세요.

AI 생성 이미지: Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기
AI 생성 이미지: Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기

4. 🚀 결론

Spring Security 6는 함수형(람다식) 구성을 권장합니다. 기존 체이닝 대신 람다식(Customizer)으로 CSRF와 CORS를 명확히 설정하면 경고를 피하고 설정 의도를 분명히 드러낼 수 있습니다. 이 글에서는 Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기 핵심을 정리했습니다.

🧠 개발 환경 최적화: 실용적인 장비 소개

보안 설정에 집중하려면 안정적인 개발 환경이 도움이 됩니다. 여기서는 실제로 사용해본 도구들을 중심으로 소개합니다. 간단한 장비 선택으로 작업 효율과 편안함을 개선할 수 있습니다.

블라우풍트 ANC 노이즈캔슬링 HIFI 블루투스 6.0 헤드셋, MISTY PINK, BLP-BH251PK [KC인증] 씽크라이프 튼튼한 대형 전동 모션데스크 높이조절 스탠딩 책상 사무용 게이밍 재택근무, 화이트 GMKtec NucBox M3 Plus LAN 미니 PC 인텔 코어 i9-12900HK 소형 데스크탑 본체 윈도우11 프로, M3 Plus LAN버전, WIN11 Pro, 512GB, 16GB, 블랙 LINGE 모니터용 거치식 블루라이트 차단 필터 시력보호 UV차단, 1개, 24인치(547X320mm)

이 포스팅은 쿠팡 파트너스 활동의 일환으로 일정액의 수수료를 제공받습니다.

다음 글에서는 실제로 CorsConfigurationSource Bean을 등록해 특정 도메인만 허용하는 실전 CORS 규칙을 구현하는 방법을 다룹니다. 읽어주셔서 감사합니다! Security : 람다식으로 CORS와 CSRF 깔끔하게 처리하기

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...