
SOP(Same Origin Policy)
- ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํํ๋ ๋ณด์ ๋ฐฉ์
https: (ํ๋กํ ์ฝ)
//github.com(ํธ์คํธ)
:443(ํฌํธ)
/cheorhyeon?tab=repositories#example
- ์ถ์ฒ(origin)๋?
Protocol, Host, Port
๋ฅผ ํตํด ๊ฐ์ ์ถ์ฒ์ธ์ง ๋ค๋ฅธ ์ถ์ฒ์ธ์ง ํ๋จํ ์ ์๋ค.
- ๋ชจ๋ ๊ฐ์์ผ ๋์ผ ์ถ์ฒ
- ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ : Port๊ฐ ๋ฌ๋ผ๋ ๋์ผ ์ถ์ฒ๋ก ์ธ์
- localhost์ 127.0.0.1์ ๋ธ๋ผ์ฐ์ ์์๋ ๋ค๋ฅด๊ฒ ์ธ์
- String Value๋ก ๋น๊ตํ๊ธฐ์ ๋ค๋ฅธ ์ถ์ฒ๋ก ์ธ์
์ SOP๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น? ๋ณด์์ ์ํจ
์ ๋ํ ์ฌ์ฉ์
1. ํ์ด์ค๋ถ ์๋น์ค ๋ก๊ทธ์ธ ์ดํ ์ฌ์ฉ(ํ์ด์ค๋ถ์์ ์ธ์ฆ ํ ํฐ์ ๋ฐ์์ด)
2. ํด์ปค : ํฅ๋ฏธ์ง์งํ ๋ด์ฉ๊ณผ ๋งํฌ๋ฅผ ๋ฉ์ผ์ ํตํด ๋ณด๋
3. ๋งํฌ๋ฅผ ํด๋ฆญํ๋ hacker.ck
๋ก ์ด๋๋จ
- ํด๋น ๋งํฌ๋
ํ์ด์ค๋ถ์ ๋๋ ๋ฐ๋ณด๋ค ๋ผ๋ ํฌ์คํธ ๊ฒ์ ํ๋ผ๋ ์ฝ๋ ๋ดํฌ
hacker.ck
์์ ์ ๋ํ ์ฌ์ฉ์์ ํ ํฐ์ ์ด์ฉํด ํ์ด์ค๋ถ์ ๋๋ ๋ฐ๋ณด๋ค ํฌ์คํธ ๊ฒ์
- origin์ด ๋ค๋ฆ
- ํด์ปค :
hacker.ck
!= ํ์ด์ค๋ถ : https://www.facebook.com/
- ์ฆ ๋ค๋ฅธ Origin -> Cross Origin ์ด๋ผ ํ๋จํ๊ณ ์์ฒญ์ ๋ฐ์๋ค์ฌ์ง์ง ์์
๋ง์ฝ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๊ฐ ํ์ํ๋ค๋ฉด?
CORS(Cross-Origin Resource Sharing)
- ๊ต์ฐจ ์ถ์ฒ๊ฐ ๋ฆฌ์์ค ๊ณต์
- ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด
๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผ
ํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์๋ ค์ฃผ๋ ์ฒด์
CORS ์ ๊ทผ์ ์ด ์๋๋ฆฌ์ค
- ๋จ์ ์์ฒญ(Simple Request)
- ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ(Preflight Request)
- ์ธ์ฆ์ ๋ณด ํฌํจ ์์ฒญ(Credentialed Request)
ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ(Preflight Request) : ์ฌ์ ํ์ธ ์์
OPTIONS ๋ฉ์๋
๋ฅผ ํตํด ๋ค๋ฅธ ๋๋ฉ์ธ์ ๋ฆฌ์์ค์ ์์ฒญ์ด ๊ฐ๋ฅํ ์ง ํ์ธํ๋ ์์
- (Preflight Request) ์์ฒญ์ ์ด๋ ๊ฒ ๋ณด๋ผ๊ฑด๋ฐ ๊ฐ๋ฅํ๋? ๋ผ๊ณ ๋ฌผ์ด๋ณด๋ ์์ฒญ
- (Preflight Response) ์๋ฒ์ธก์์ ๊ฐ๋ฅํ์ง์ ๋ํ ์๋ต
- ์์ฒญ์ด ๊ฐ๋ฅํ๋ค๋ฉด ์ค์ ์์ฒญ(Actual Request)๋ฅผ ๋ณด๋ธ๋ค.
Preflight Request ์์ฒญ ํฌ๋งท
- Origin : ์์ฒญ ์ถ์ฒ
- Access-Control-Request-Method : ์ค์ ์์ฒญ ๋ฉ์๋
- Access-Control-Request-Headers : ์ค์ ์์ฒญ์ ์ถ๊ฐ ํค๋
Preflight Response ์๋ต
- Access-Control-Allow-Origin : ์๋ฒ์ธก ํ๊ฐ ์ถ์ฒ
- Access-Control-Allow-Methods : ์๋ฒ ์ธก ํ๊ฐ ๋ฉ์๋
- Access-Control-Allow-Headers : ์๋ฒ ์ธก ํ๊ฐ ํค๋
- Access-Control-Max-Age : preflight ์๋ต ์บ์ ๊ธฐ๊ฐ
Access-Control-Max-Age ์ค์ ํ์ ์ด์
- Preflight ์์ฒญ์ ๋ณด๋ด์ผ ํ ๊ฒฝ์ฐ ์ค์ง์ ์ผ๋ก 2๋ฒ ์์ฒญ์ด ๋ณด๋ด์ง๋ค.
- Preflight๋ก ์์ฒญ ๊ฐ๋ฅํ์ง ํ์ธ + ์ค์ ์์ฒญ
- ๋งค๋ฒ 2๋ฒ ๋ณด๋ด์ผํ๋ ๊ฒ์ ๋นํจ์จ
- ๋ฐ๋ผ์ ํ๋ฆฌํ๋ผ์ดํธ ์๋ต ์บ์ฑ ํด๋๊ณ ์์ฒญ์ด ์ค๋ฉด ์ฌ์ ํ์ธ ์์ด ๋ฐ๋ก ๋ณด๋ด๋๊ฑฐ ๋ฐ์๋ค์
- PREFLIGHT RESPONSE ์์ฑ ์ค Access-Control-Max-Age
Preflight Response๊ฐ ๊ฐ์ ธ์ผ ํ๋ ํน์ง
- ์๋ต ์ฝ๋๋ 200๋์ฌ์ผ ํ๋ค.
- ์๋ต ๋ฐ๋๋ ๋น์ด์๋ ๊ฒ์ด ์ข๋ค.
๋จ์ ์์ฒญ(Simple Request)
- preflight์ ๋ค๋ฅด๊ฒ ๋ฐ๋ก ๋ณธ ์์ฒญ์ ๋ ๋ฆฌ๋ฉด์ ๊ทธ ์ฆ์ Cross Origin์ธ์ง ํ์ธํ๋ ์ ์ฐจ
์๋ ์กฐ๊ฑด ๋ชจ๋ ์ถฉ์กฑํด์ผ Simple Request
- GET, POST, HEAD ๋ฉ์๋ ๋ง์กฑ
- Content-Type ์๋ 3๊ฐ์ง ์ค ํ๋
- application/x-www-form-urlencoded
- multipart/form-date
- text/plain
- ํค๋๋ Accept, Accept-Language, Content-Language, Content-Type๋ง ํ์ฉ
Simple Request ํ๋ฆ

์ Preflight๊ฐ ํ์ํ ๊น?
Simple Request
ํ๋ฐฉ์ด๋ฉด ๋๋๋๊ฑด๋ฐ ์ ๊ตณ์ด 2๋ฒ(Preflight ์์ฒญ ๊น์ง) ๊ฐ์ผํ ๊น?
- CORS๋ฅผ ๋ชจ๋ฅด๋ ์๋ฒ๋ฅผ ์ํด์๋ผ๊ณ ์ดํดํ๋ ๊ฒ์ด ํธํจ
CORS ๋ชจ๋ฅด๋ ์๋ฒ
- CORS ์๋ฌด๋ฐ ์ค์ ์๋ ์๋ฒ
- ์ : simpleํ get์์ฒญ
- ์๋ฒ์์๋ CORS ์ค์ ์ ์๋ฌด๊ฒ๋ ์ํจ
- ๊ทธ๋๋ก ์๋ต ๋ฐํํ๋๋ฐ
ALLOW-ORIGIN
์ด ์๊ธฐ์ ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ!
๋ผ ์๋ต

Preflight๊ฐ ์๋ค๋ฉด?

- ๋ง์ผ delete ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํต์ ํ๋๋ฐ Preflight ์์ฒญ์ด ์๋ค๋ฉด
- ์ค์ ์๋ฒ์์๋ Data ์ญ์ ๋ฐ ์ฑ๊ณต ์๋ต
- SOP ์๋ฐ์ด๋ผ CORS ์๋ฌ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋ด๋๋ฐ ์ด๋ฏธ ์๋ฒ์์๋ ์ญ์ ์ฒ๋ฆฌ๊ฐ ๋ ์ํฉ
- ์ฆ CORS ์๋ฌ๋ฅผ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๋ค์์ ์๋ต๋ฐ๊ธฐ์ ์ฌ๊ฐํ ๋ฌธ์ ์ผ์๋ ์์
Preflight ์์ฒญ ํ๋ฆ

- Preflight๋ ์ฌ์ ์์ฒญ์ผ๋ก ์๋ฒ์์ ์ด๋ค ๋์์ ํ์ง ์์
- Preflight ์์ฒญ์ด ์คํจํ ๊ฒฝ์ฐ ์ค์ ์์ฒญ์ ๋ณด๋ด์ง ์์
- ์๋ฒ๋ ์์ ํ๊ฒ ์ ์ง์ผ์ง
์ธ์ฆ์ ๋ณด ํฌํจ ์์ฒญ(Credentialed Request)
- ์ธ์ฆ ๊ด๋ จ ํค๋ ํฌํจํ ๋ ์ฌ์ฉํ๋ ์์ฒญ
- JWT๋ฅผ ํด๋ผ์ด์ธํธ์์ ์๋์ผ๋ก ๋ด์์ ๋ณด๋ด๊ณ ์ถ์๋
credentials
๋ฅผ include
- ํด๋ผ์ด์ธํธ์ธก credentials : include
- ์๋ฒ์ธก Access-Control-Allow-Credentials : true
- Access-Control-Allow-Origin: *๋ ์๋จ, ํน์ url ๋ช
์ ํ์
- Credentials true์ธ๋ฐ Origin *๋ฉด ์์ธ ํฐ์ง
CORS ํด๊ฒฐ
ํ๋ก ํธ ํ๋ก์ ์๋ฒ ์ค์ (๊ฐ๋ฐ ํ๊ฒฝ)

- ๋ธ๋ผ์ฐ์ ์์ 8181 -> ํ๋ก ํธ 8081 ๋ฐ์์ ์๋ฒ 8080์ผ๋ก ํ ์ค
- ๋ด๋ถ์ ์ผ๋ก 8080 ํฌํธ๋ก ๋ฐ๊ฟ์ ์์ฒญ ์ฒ๋ฆฌ
- ์๋ตํ ๋ 8081๋ก ์๋ต
์ง์ ํค๋์ ์ค์
- ์์์์ ๋์ด๊ฐ
- ๋ค์ ๋ฒ๊ฑฐ๋ก์
์คํ๋ง ๋ถํธ ์ด์ฉ ํด๊ฒฐ
์ค์ต
Preflight ์๋ ๊ฒฝ์ฐ ์์(Simple Request Get)
8081
ํฌํธ์์ 8080
์๋ฒ๋ก api ์์ฒญ
- ์ค์ ๋ก Server์์ OK๋ก ์๋ต
- ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์์
CORS
๋ฌธ์ ๋ฐ์
- ์์์ ์ธ๊ธํ๋๋ก
preflight
์์๋๋ผ๋ฉด..!
Spring @CrossOrigin
์ด๋
ธํ
์ด์
- ์ปจํธ๋กค๋ฌ์ ์ค์ ํ๋ฉด ๋๋จ
- ๊ฐ๋ณ ๋ฉ์๋๋ ๊ฐ๋ฅ
@CrossOrigin(origins = "http://localhost:8081")
@CrossOrigin(origins = "*", allowCredentials = "true)
- ์์์ ์ธ๊ธํ๋๋ก ์๋ ์ค์ ์ ๋๊ฐ ๊ฐ์ด ๋์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋จ ํ์ธ
- origins =
*
- allowCredentials = "true"
@CrossOrigin
์ด๋
ธํ
์ด์
์ ๊ฒฝ์ฐ ํ์ํ๊ณณ์ ๋ชจ๋ ๋ถ์ฌ์ผ ํ๋ค.
- ์ ์ญ์ ์ผ๋ก ์ค์ ํ๊ธฐ ์ํด
CorsConfiguration
์์ฑ
@Configuration
public class CorsConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:8081");
}
}