[Spring] CORS ์๋ฌ ํด๊ฒฐ์ ์ํ ์ค์ ๋ฐ ํฌ์คํธ๋งจ์ผ๋ก ํ ์คํธ ํ๋ ๋ฐฉ๋ฒ
๋ฌธ์ ๋ฐฐ๊ฒฝ
์ํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉ์ํ๋ฉด ip ํ์ฉ ์ค์ ์ ํ์ง ์์๋ ๋๋ ์ค ์์๋๋ฐ ํ๋ก ํธ ์๋ฒ ๋ฐฐํฌ ํ CORS ์๋ฌ๊ฐ ์๊ฒผ๋ค.
์ฐพ์๋ณด๋ CORS๋ ์น ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ ์๋ฒ์ ์ํ๋ฆฌํฐ ์ค์ ๊ณผ๋ ๋ณ๊ฐ๋ผ๊ณ ํ๋ค.
CORS(Cross-Origin Resource Sharing)๋?
๋ธ๋ผ์ฐ์ ์์ ๋ค๋ฅธ ๋๋ฉ์ธ(์ถ์ฒ)์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ๋ฐ์ํ๋ ๋ณด์ ์ ํ์ ๊ด๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค.
์น ํ์ด์ง๊ฐ A.com ๋๋ฉ์ธ์์ ๋ก๋๋์๊ณ , ์ด ์น ํ์ด์ง๊ฐ B.com์ API๋ฅผ ํธ์ถํ๋ ค๊ณ ํ ๋, ๋ธ๋ผ์ฐ์ ๋ ๋์ผ ์ถ์ฒ ์ ์ฑ (Same-Origin-Policy)์ ์ํด ์ด ์์ฒญ์ ์ฐจ๋จํ๋ ค๊ณ ํ๋ค.
์ด ๋ B.com ์๋ฒ์์ ์ ์ ํ CORS ํค๋๋ฅผ ๋ฐํํ๋ฉด ์ด ์์ฒญ์ด ํ์ฉ๋ ์ ์๋ค.
์ฆ, ์ํ๋ฆฌํฐ ์ค์ ์ด ๋์ด ์์ง ์์ ์๋ฒ๋ผ๋ ํด๋น ์๋ฒ๊ฐ CORS ํค๋๋ฅผ ์ ์ ํ ๋ฐํํ์ง ์์ผ๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์๋ CORS ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋ฒ๊ฐ CORS๋ฅผ ์ง์ํ๋ ค๋ฉด ์๋ต ํค๋์ 'Access-Control-Allow-Origin'์ ํฌํจํด์ผ ํ๋ค.
๋ฌธ์ ํด๊ฒฐ
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://java-jober.netlify.app", "http://localhost:5173")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
์์ ๊ฐ์ด WebConfig ํด๋์ค์ addCorsMapping ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ณ ์๋ฒ๋ฅผ ์ฌ๋ฐฐํฌํ์๋ค.
์ฒ์์๋ ๋ชจ๋ ๋๋ฉ์ธ(์ถ์ฒ)๋ฅผ ํ์ฉํ๋ ค๊ณ .allowedOrigins("*") ๋ก ํ์๋๋ฐ allowCredentials ๋ฅผ true๋ก ์ค์ ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ํฌ๋ฆฌ๋ด์ (์ฟ ํค๋ http ์ธ์ฆ๊ณผ ๊ฐ์)์ด ์๋ ์๋ต์ ํ๋ก ํธ์๋ JavaScript์ ๋ ธ์ถํ๋๋ก ํ์ฉํ๋ค.
๊ทธ๋ฌ๋ ๋ณด์ ์์ ์ด์ ๋ก true์ผ ๋๋ allowedOrigins์ "*"๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค.
๊ทธ๋์ allowCredentials๋ฅผ true๋ก ์ค์ ํ๋ค๋ฉด,
- allowedOriginsPatterns์ ํฌ๋ฆฌ๋ด์ ์ ํ์ฉํ๋ ํน์ ์ถ์ฒ ์งํฉ์ด ์๋ค๋ฉด ๋ช ์์ ์ผ๋ก ๋์ดํ๊ฑฐ๋
- allowedOrigins์ ํน์ ๋๋ฉ์ธ์ ๋ช ์ํด์ฃผ์ด์ผ ํ๋ค.
์ด๋ ๊ฒ ํด์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋์ ํ๋ก ํธ ๋ฐฐํฌ ์ฃผ์์ ํ๋ก ํธ์ ๋ก์ปฌ ์ฃผ์๋ฅผ ๋ช ์ํด์ฃผ์๋ค.
(ํ๋ก ํธ ๋ก์ปฌ์ฃผ์๋ ํ๋ก ํธ ๊ฐ๋ฐ์ ๋ถ๋ค์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ์๋ฒ๋ ํต์ ํ๊ธฐ ์ํด ํ์)
ํ ์คํธ ๋ฐฉ๋ฒ
ํฌ์คํธ๋งจ์์ Headers์ ์์ ๊ฐ์ด ํค์ ๊ฐ์ ๋ฃ๊ณ ์์ฒญํ๋ฉด
์๋ต Headers์ Access-Control-Allow-Origin ๊ฐ์ด ํ์ฉํ ๋๋ฉ์ธ์ผ๋ก ์ค์ ๋์ด ์์ผ๋ฉด CORS ์ค์ ์ด ์ ๋๊ฒ์ด๋ค!