[Spring] ๐Ÿ•ธ๏ธFilter๋ž€?

Sangho Hanยท2025๋…„ 4์›” 24์ผ
3

๐ŸŒฑ Spring

๋ชฉ๋ก ๋ณด๊ธฐ
8/12
post-thumbnail

๐Ÿ“Œ Filter?

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋Š” HTTP ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์„ DispatcherServlet์ด ๋ฐ›๊ธฐ ์ „์— ๊ฐ€๋กœ์ฑ„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

์ฆ‰, ํ•„ํ„ฐ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ ์š”์ฒญ & ์‘๋‹ต์„ ์‚ฌ์ „ & ์‚ฌํ›„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์„œ๋ธ”๋ฆฟ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

์„œ๋ธ”๋ฆฟ ์ปดํฌ๋„ŒํŠธ

์„œ๋ธ”๋ฆฟ ์ปดํฌ๋„ŒํŠธ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

1. ์„œ๋ธ”๋ฆฟ (Servlet)

  • ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์‘๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค.
  • HttpServlet์„ ์ƒ์† ๋ฐ›์•„ ๊ตฌํ˜„ํ•œ๋‹ค.

Spring ์˜ˆ์‹œ ์ฝ”๋“œ

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        resp.getWriter().write("Hello, Servlet!");
    }
}

Spring Boot์˜ˆ์‹œ ์ฝ”๋“œ

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.getWriter().write("Hello, Spring Boot!");
    }
}
@SpringBootApplication
@ServletComponentScan
public class MyApplication { ... }
  • ์ตœ๊ทผ์—๋Š” ์„œ๋ธ”๋ฆฟ์„ ์ž˜ ์“ฐ์ง€๋Š” ์•Š์œผ๋ฉฐ, @RestController , @RequestMapping์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฐธ๊ณ  ๊ธ€

2. ํ•„ํ„ฐ (Filter)

  • ์„œ๋ธ”๋ฆฟ ์‹คํ–‰ ์ „/ํ›„์— ๋™์ž‘ํ•œ๋‹ค.
  • ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ „์ฒ˜๋ฆฌ ๋˜๋Š” ํ›„์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์ฃผ๋กœ ๋ณด์•ˆ, ๋กœ๊น…, CORS ๋“ฑ์— ์‚ฌ์šฉํ•œ๋‹ค.

Spring ์˜ˆ์‹œ ์ฝ”๋“œ

@WebFilter("/*")
public class LogFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        System.out.println("Request Start");
        chain.doFilter(req, res); // ๋‹ค์Œ ํ•„ํ„ฐ ๋˜๋Š” ์„œ๋ธ”๋ฆฟ ํ˜ธ์ถœ
        System.out.println("Response End");
    }
}

Spring Boot ์˜ˆ์‹œ ์ฝ”๋“œ

@Component
public class LogFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("๐ŸŒ ํ•„ํ„ฐ ๋™์ž‘");
        chain.doFilter(request, response);
    }
}
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<LogFilter> logFilter() {
        FilterRegistrationBean<LogFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new LogFilter());
        registrationBean.addUrlPatterns("/*"); // ์ „์ฒด ์š”์ฒญ
        registrationBean.setOrder(1); // ํ•„ํ„ฐ ์ˆœ์„œ
        return registrationBean;
    }
}
  • ์ˆœ์„œ๋‚˜ ๊ฒฝ๋กœ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ๋ฆฌ์Šค๋„ˆ (Listener)

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์„ธ์…˜, ์š”์ฒญ ๋“ฑ ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.
  • ๋ฆฌ์†Œ์Šค ์ดˆ๊ธฐํ™”, ์„ธ์…˜ ์ถ”์ , ํ†ต๊ณ„ ๋“ฑ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

Spring ์˜ˆ์‹œ ์ฝ”๋“œ

@WebListener
public class AppListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘๋จ");
    }

    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ๋จ");
    }
}

Spring Boot ์˜ˆ์‹œ ์ฝ”๋“œ

@Component
public class AppListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("๐Ÿš€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("๐Ÿ›‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ");
    }
}
  • @WebListener ๋Œ€์‹ ์— @Component๋กœ ์ž๋™ ๋“ฑ๋กํ•œ๋‹ค.
  • @ServletComponentScan ๋˜ํ•œ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

๐Ÿ“Œ ์™œ Filter๋ฅผ ์จ์•ผ ํ• ๊นŒ?

Spring Boot์—๋Š” ์ด๋ฏธ @RestController, Interceptor, AOP ๋“ฑ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹๋“ค์ด ์กด์žฌํ•œ๋‹ค.

๊ทธ๋Ÿผ์—๋„ Filter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

์ „์—ญ ์ฒ˜๋ฆฌ

์•„๋ž˜ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘ ๊ณผ์ •์„ ๊ฐ„๋žตํžˆ ์‚ดํŽด๋ณด์ž.

[ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ]
  โ†“
[์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ (Tomcat ๋“ฑ)]
  โ†“
[Filter] โ† ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์„œ๋ธ”๋ฆฟ API ์˜์—ญ
  โ†“
[DispatcherServlet] โ† ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ Spring MVC
  โ†“
[HandlerMapping โ†’ Controller โ†’ View ์ฒ˜๋ฆฌ]

ํ•„ํ„ฐ๋Š” Spring MVC๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.
๋ฐ˜๋ฉด, Interceptor, ControllerAdvice, @Controller ๋“ฑ์€ ๋ชจ๋‘ DispatcherServlet ์ดํ›„์— ์ž‘๋™ํ•œ๋‹ค.

๋•Œ๋ฌธ์— ํ•„ํ„ฐ๋Š” Spring ์ง„์ž… ์ „, ๊ณตํ†ต ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ˆ˜๋‹จ์ด๊ธฐ์— ์‚ฌ์šฉํ•œ๋‹ค.


๐Ÿ“Œ Filter ์‚ฌ์šฉ ์‚ฌ๋ก€

์‹ค์ œ ์ฝ”๋“œ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ณด๋ฉด์„œ ํ•„ํ„ฐ์— ๋Œ€ํ•ด ๋”์šฑ ๊นŠ์ด ์ดํ•ดํ•ด๋ณด์ž.

์˜ˆ์‹œ ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค!

1. ์š”์ฒญ/์‘๋‹ต ์‹œ๊ฐ„ ๋กœ๊น… ํ•„ํ„ฐ

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Slf4j
@Component
public class LoggingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long start = System.currentTimeMillis();

        HttpServletRequest req = (HttpServletRequest) request;
        log.info("๐Ÿ“ฅ ์š”์ฒญ URI: {}", req.getRequestURI());

        chain.doFilter(request, response);

        long duration = System.currentTimeMillis() - start;
        log.info("๐Ÿ“ค ์ฒ˜๋ฆฌ ์™„๋ฃŒ ({}ms)", duration);
    }
}

๊ฒฐ๊ณผ ์˜ˆ์‹œ

INFO  [LoggingFilter] ๐Ÿ“ฅ ์š”์ฒญ URI: /api/v1/users
INFO  [LoggingFilter] ๐Ÿ“ค ์ฒ˜๋ฆฌ ์™„๋ฃŒ (87ms)

์œ„์ฒ˜๋Ÿผ ๊ตฌ์„ฑํ•˜์—ฌ ๋“ฑ๋กํ•ด ๋‘”๋‹ค๋ฉด ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ค API์—์„œ ๋ณ‘๋ชฉ์ด ์ƒ๊ธฐ๋Š” ์ง€ ํŒŒ์•…์ด ์šฉ์ดํ•˜๋‹ค.

2. UTF-8 ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ

import jakarta.servlet.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Slf4j
@Component
public class EncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        log.debug("๐Ÿ“Œ UTF-8 ์ธ์ฝ”๋”ฉ ์„ค์ • ์™„๋ฃŒ");

        chain.doFilter(request, response);
    }
}
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<EncodingFilter> encodingFilter() {
        FilterRegistrationBean<EncodingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new EncodingFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setOrder(1); // ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋„๋ก ์„ค์ •
        return registrationBean;
    }
}

์œ„์™€ ๊ฐ™์ด ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ํ›„์—, ๋“ฑ๋กํ•ด ์ฃผ๋ฉด ์ ์šฉ๋œ๋‹ค.

๐Ÿ‘จโ€๐Ÿ’ป ํ•˜์ง€๋งŒ Spring Boot 1.2.0 ๋ฒ„์ „ ์ดํ›„๋กœ๋Š” CharacterEncodingAutoConfiguration์ด ๋“ฑ์žฅํ•˜๋ฉฐ, CharacterEncodingFilter๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š” ๊ตฌ์กฐ๊ฐ€ ๊ฐ–์ถฐ์กŒ๋‹ค.
๋•Œ๋ฌธ์— ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋“ฑ๋กํ•  ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์กŒ๋‹ค.

org.springframework.boot.autoconfigure.web.servlet.CharacterEncodingAutoConfiguration ํด๋ž˜์Šค๋Š”,
spring.http.encoding.enabled = true์ธ ๊ฒฝ์šฐ์— ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ด ์ค€๋‹ค.

๋””ํดํŠธ ๊ฐ’์ด UTF-8 ์ด๊ธฐ์— ๋”ฐ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ์˜ ๋“ฑ๋ก ์—†์ด๋„ ์ถฉ๋ถ„ํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งŒ์•ฝ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด .yaml ํŒŒ์ผ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

spring:
  http:
    encoding:
      charset: MS949
      force: true

3. CORS ํ•„ํ„ฐ

๊ฐ€. OPTIONS ์š”์ฒญ

CORS์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋„˜์–ด๊ฐ€๊ณ , CORS์™€ OPTIONS์˜ ๊ด€๊ณ„์„ฑ์— ๋Œ€ํ•ด์„œ ์ ์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—์„œ ๋จผ์ € OPTIONS ์š”์ฒญ(Preflight)์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

1) ๋‹ค๋ฅธ Origin์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ

2) ๋™์ผ Origin์ด์ง€๋งŒ, ๋ณต์žกํ•œ ์š”์ฒญ์ธ ๊ฒฝ์šฐ

  • ์ปค์Šคํ…€ ํ—ค๋”๊ฐ€ ์กด์žฌ (Authorization ๋“ฑ..)
  • PATCH, PUT ๋“ฑ ๋ฉ”์„œ๋“œ
  • ๋ฐ˜ํ™˜ ํƒ€์ž…์ด urlencoded๊ฐ€ ์•„๋‹˜ (application/json ๋“ฑ..)

๋™์ผ Origin์ด๋ผ๋ฉด CORS๋ฅผ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, 1๋ฒˆ ๋‹ค๋ฅธ Origin์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ์— ์ง‘์ค‘ํ•˜๋ฉด ๋œ๋‹ค.

OPTIONS ์š”์ฒญ์€ ๋””์ŠคํŒจ์น˜ ์„œ๋ธ”๋ ›์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์š”์ฒญ ๋ธŒ๋ผ์šฐ์ €์—์„œ 200ok๋ฅผ ๋ฐ›๋Š”๋‹ค๋ฉด ์‹ค์ œ ๋ฉ”์„œ๋“œ (GET, POST..) ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

๋‚˜. DispatcherServlet์˜ ํ•œ๊ณ„

ํ•˜์ง€๋งŒ ๋ฐ›์€ ์‘๋‹ต์˜ ํ—ค๋”์— CORS ํ—ˆ์šฉ ์„ค์ •์ธ Access-Control-Allow-* ๊ฐ’์ด ์—†๋‹ค๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์‹ค์ œ ์š”์ฒญ์„ ์ฐจ๋‹จํ•˜์—ฌ CORS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ฆ‰, ์š”์ฒญ ์ž์ฒด๋Š” ๋ฌธ์ œ ์—†์ด ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋”๋ผ๋„ CORS ํ—ˆ์šฉ ํ—ค๋”๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ์— CORS ํ—ˆ์šฉ ํ—ค๋”๋ฅผ ๋””์ŠคํŒจ์น˜ ์„œ๋ธ”๋ › ๋™์ž‘ ์ „์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์—ฌ๊ธฐ์„œ ํ•„ํ„ฐ๊ฐ€ ์“ฐ์ด๊ฒŒ ๋œ๋‹ค.

๋‹ค. Spring Security๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Slf4j
@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Access-Control-Allow-Origin", "*"); // ๋ชจ๋“  origin ํ—ˆ์šฉ
        res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");

        chain.doFilter(request, response);
    }
}

Spring Security๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋™์ผํ•˜๊ฒŒ ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์ค€ ํ›„ ์„ค์ •์—์„œ ๋“ฑ๋กํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ตœ๊ทผ์—๋Š” Spring Security๋ฅผ ๋งŽ์ด๋“ค ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์˜ˆ์‹œ๋„ ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋ผ. Spring Security๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .cors(withDefaults()) // CORS ์„ค์ • ํ™œ์„ฑํ™”
            .csrf().disable()
            .authorizeHttpRequests()
                .anyRequest().permitAll();

        return http.build();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();

        config.addAllowedOriginPattern("*");
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");

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

์šฐ์„  corsConfigurationSource() ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์„ค์ • ๊ฐ’๋“ค์„ ์ง€์ •ํ•œ๋‹ค.

์ดํ›„ ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ ์ฒด์ธ์— .cors(withDefaults())๋กœ ๋“ฑ๋กํ•ด ์ฃผ๋ฉด ๋์ด๋‹ค.
ํ•ด๋‹น ์ฝ”๋“œ๋Š” "CORS ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค"๋ผ๋Š” ๋œป์ด๋ฉฐ, ๋™์ž‘ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. @Bean CorsConfigurationSource๋ฅผ ๋“ฑ๋กํ•ด ๋‘ 
  2. .cors(withDefaults())๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€
  3. Spring Security ๋‚ด๋ถ€์—์„œ CorsFilter๋ฅผ ์ƒ์„ฑ
  4. Security Filter Chain ๋‚ด์— CorsFilter๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€
profile
์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํ•œ์ƒํ˜ธ์ž…๋‹ˆ๋‹ค.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 4์›” 24์ผ

ํ•„ํ„ฐ๊ฐ€ ํ†ฐ์ผ“์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ์Šคํ”„๋ง์—์„œ ํ•„ํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜๋Š”์ง€๋„ ์ฐพ์•„๋ณด๋ฉด ์ข‹์„๋“ฏ?

1๊ฐœ์˜ ๋‹ต๊ธ€