CS
๐พ [CS] CORS๋?
1๏ธโฃ CORS.
- CORS(Cross-Origin Resource Sharing)๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก ๋ค๋ฅธ ์ถ์ฒ(๋๋ฉ์ธ, ํ๋กํ ์ฝ, ๋๋ ํฌํธ)๋ฅผ ๊ฐ์ง ๋ฆฌ์์ค ๊ฐ์ ์์ฒญ์ ์์ ํ๊ฒ ์ํํ ์ ์๋๋ก ํ๋ ๋ณด์ ๊ธฐ๋ฅ์
๋๋ค.
- CORS(Cross-Origin Resource Sharing)๋ ์น ํ์ด์ง๊ฐ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ๋ฐ์ํ๋ ๋ณด์ ์ ์ฝ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค.
2๏ธโฃ ์ CORS๊ฐ ํ์ํ๊ฐ?
- ์น ๋ณด์ ๋ชจ๋ธ์์ ๋์ผ ์ถ์ฒ ์ ์ฑ
(Same-Origin Policy)์ ๋ณด์์์ ์ด์ ๋ก, ์น ํ์ด์ง์์ ๋ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์์ ์ด ๋ก๋๋ ์ถ์ฒ ์ธ๋ถ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ ์ ํํฉ๋๋ค.
- ์ฆ, ํ ์น ํ์ด์ง์์ ๋ก๋๋ ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค(์: API ์๋ํฌ์ธํธ, ์ด๋ฏธ์ง ๋ฑ)์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์ด ๋ณด์ ์ ์ฑ
์ ์ฌ์ดํธ ๊ฐ ์์ฒญ ์์กฐ(CSRF)์ ๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
- ํ์ง๋ง, ๋ง์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ๋ถ API๋ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์๋ ๋ฆฌ์์ค์ ์ ๊ทผํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค.
- ์ด๋, CORS๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ถ์ฒ์์ ์ค๋ ์์ฒญ์ ํ์ฉํ ์ ์์ต๋๋ค.
3๏ธโฃ CORS์ ๋์ ๋ฐฉ์.
- CORS๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํด ๋ค๋ฅธ ์ถ์ฒ์์์ ์ ๊ทผ์ ํ์ฉํ ์ง ์ฌ๋ถ๋ฅผ HTTP ํค๋๋ฅผ ํตํด ๋ช
์ํฉ๋๋ค.
CORS๋ฅผ ๊ตฌํํ๋ ๊ณผ์ .
-
1. Preflight Request
- ๋ธ๋ผ์ฐ์ ๋ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ OPTIONS ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์๋ฒ์ โ์ฌ์ ์์ฒญ(preflight request)โ์ ๋ณด๋
๋๋ค.
- ์ด ์์ฒญ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด๋ ค๊ณ ํ๋ ์ค์ ์์ฒญ์ ๋ฉ์๋์ ํค๋๊ฐ ์๋ฒ์์ ํ์ฉ๋๋์ง ํ์ธํฉ๋๋ค.
-
2. ์๋ฒ ์๋ต
- ์๋ฒ๋
Access-Control-Allow-Origin
๋ฑ์ CORS ๊ด๋ จ ํค๋๋ฅผ ํฌํจํ ์๋ต์ ๋ฐํํฉ๋๋ค.
- ์ด ์๋ต์ ํตํด ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ถ์ฒ์ ์์ฒญ์ ํ์ฉํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
-
3. ์ค์ ์์ฒญ
- ์๋ฒ๊ฐ ํ์ฉํ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ต๋๋ค.
4๏ธโฃ ์ฃผ์ CORS ํค๋.
-
Access-Control-Allow-Origin
- ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ทผ์ ํ์ฉ๋ฐ์ ์ถ์ฒ๋ฅผ ์ง์ ํฉ๋๋ค.
- ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ ค๋ฉด
*
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Access-Control-Allow-Origin: https://example.com
-
Access-Control-Allow-Methods
- ์๋ฒ๊ฐ ํ์ฉํ๋ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๋ฅผ ์ง์ ํฉ๋๋ค.
Access-Control-Allow-Methods: GET, POST
-
Access-Control-Allow-Credentials
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์๊ฒฉ ์ฆ๋ช
(์ฟ ํค, ์ธ์ฆ ํค๋ ๋ฑ)์ ํฌํจํ ์์ฒญ์ ํ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๊ฐ์ผ๋ก๋
true
๋๋ false
๊ฐ ์ฌ ์ ์์ต๋๋ค.
Access-Control-Allow-Credentials: true
-
Access-Control-Max-Age
- ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ ์์ฒญ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ ์ ์๋ ์๊ฐ์ ์ด ๋จ์๋ก ์ง์ ํฉ๋๋ค.
Access-Control-Max-Age: 3600
5๏ธโฃ CROS ์ค์ ์์(์๋ฒ ์ธก)
- ์๋ฒ ์ธก์์ CORS๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ ์ค์ธ ์น ์๋ฒ ๋๋ ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
- ๋ค์์ Java SpringBoot ์ ํ๋ฆฌ์ผ์ด์
์์ CORS๋ฅผ ์ค์ ํ๋ ์์
๋๋ค.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowedCredentials(true)
.maxAge(3600);
}
}
- ์ ์ค์ ์ ํน์ ์ถ์ฒ(
https://example.com
)์์ ์ค๋ ๋ชจ๋ ๊ฒฝ๋ก์ ์์ฒญ์ ๋ํด CORS๋ฅผ ํ์ฉํ๊ณ , ํน์ HTTP ๋ฉ์๋์ ํค๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
6๏ธโฃ ์์ฝ.
-
CORS ๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๋ณด์ ๊ธฐ๋ฅ์
๋๋ค.
-
CORS ๋ ์๋ฒ๊ฐ ์๋ต ํค๋๋ฅผ ํตํด ํน์ ์ถ์ฒ์ ์์ฒญ์ ํ์ฉํ ์ ์๋๋ก ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ๋ถ API๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
-
CORS ๋ฅผ ์ ์ ํ ์ค์ ํ๋ฉด, ๋ณด์์ฑ์ ์ ์งํ๋ฉด์๋ ๋ค์ํ ์ถ์ฒ์์์ ๋ฆฌ์์ค ์ ๊ทผ์ ํ์ฉํ ์ ์์ต๋๋ค.