๊ฐœ๋ฐœ Life

์Šคํ”„๋ง CORS ์„ค์ •

SOBOB 2024. 11. 25. 14:45
๋ฐ˜์‘ํ˜•
CorsFilterkmi.hc.hops.api.config.CorsFilterCorsFilter/*

Vue + ์Šคํ”„๋ง(๋ถ€ํŠธ์•„๋‹˜)์œผ๋กœ ๊ฐœ๋ฐœ ํ…Œ์ŠคํŠธ ์ค‘์ธ๋ฐ, cors ์—๋Ÿฌ๋กœ ํ†ต์‹ ์ด ์•ˆ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

 

Access to XMLHttpRequest at 'http://127.0.0.1:8081/user/login' from origin 'http://localhost:9000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด์ง€๋งŒ, ํ”„๋ก ํŠธ๋‹จ์—์„œ cors ์ฒ˜๋ฆฌํ•˜๋Š”๊ฑด, ์ž„์‹œ ๋ฐฉํŽธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ์—”๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

1. web.xml์— filter ์ถ”๊ฐ€

	<filter>
		<filter-name>CorsFilter</filter-name>
		<filter-class>test.api.config.CorsFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>CorsFilter</filter-name>
		<url-pattern>/*</url-pattern> <!-- ๋ชจ๋“  URL์— ๋Œ€ํ•ด ํ•„ํ„ฐ ์ ์šฉ -->
	</filter-mapping>

 

 

2. filter ์ถ”๊ฐ€

package test.api.config;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CorsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ์ž‘์„ฑ
    }

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

        // CORS ํ—ค๋” ์ถ”๊ฐ€
        res.setHeader("Access-Control-Allow-Origin", "http://localhost:9000"); // ํ—ˆ์šฉํ•  ๋„๋ฉ”์ธ
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // ํ—ˆ์šฉํ•  HTTP ๋ฉ”์„œ๋“œ
        res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); // ํ—ˆ์šฉํ•  ์š”์ฒญ ํ—ค๋”
        res.setHeader("Access-Control-Allow-Credentials", "true"); // ์ธ์ฆ ์ •๋ณด ํ—ˆ์šฉ

        // ํ•„ํ„ฐ ์ฒด์ธ์„ ํ†ตํ•ด ๋‹ค์Œ ํ•„ํ„ฐ๋กœ ์ด๋™
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // ์ข…๋ฃŒ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ์ž‘์„ฑ
    }
}

 

 

์ด ๋ถ€๋ถ„์ด ํ•ต์‹ฌ์ธ๋ฐ,

// CORS ํ—ค๋” ์ถ”๊ฐ€
res.setHeader("Access-Control-Allow-Origin", "http://localhost:9000"); // ํ—ˆ์šฉํ•  ๋„๋ฉ”์ธ
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // ํ—ˆ์šฉํ•  HTTP ๋ฉ”์„œ๋“œ
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); // ํ—ˆ์šฉํ•  ์š”์ฒญ ํ—ค๋”
res.setHeader("Access-Control-Allow-Credentials", "true"); // ์ธ์ฆ ์ •๋ณด ํ—ˆ์šฉ

 

ํ—ˆ์šฉํ•  ๋„๋ฉ”์ธ, ๊ทธ๋ฆฌ๊ณ  methos๋“ค์„ ์ž‘์„ฑํ•ด์„œ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•