๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web etc

CORS(Cross-origin resource sharing)๋Š” ๋ฌด์—‡์ธ๊ฐ€? | SOP (Same-origin policy) | ์ž์„ธํžˆ ์ดํ•ดํ•˜๊ธฐ

728x90

๐Ÿ˜Ž CORS๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์— ๋จผ์ € ์•Œ์•„์•ผํ•  ๊ฒƒ

๐Ÿค” SOP (Same-origin policy) ์ด๋ž€?

The same-origin policy is a critical security mechanism that restricts how a document or script loaded by one 
origin can interact with a resource from another origin.

 

MDN์— ๋”ฐ๋ฅด๋ฉด ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(same-origin policy)์€ ์–ด๋–ค ์ถœ์ฒ˜(origin)์—์„œ ๋ถˆ๋Ÿฌ์˜จ ๋ฌธ์„œ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์—์„œ ๊ฐ€์ ธ์˜จ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜๋Š” ์ค‘์š”ํ•œ ๋ณด์•ˆ ๋ฐฉ์‹์ด๋‹ค. ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์€ ์ž ์žฌ์ ์œผ๋กœ ํ•ด๋กœ์šธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ค„์—ฌ์ค€๋‹ค. ๋„ˆ๋ฌด ๊ธธ๊ณ  ์–ด๋ ต๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, origin์ด ๊ฐ™์„ ๋•Œ๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ด์ฃผ๋Š” ๋ณด์•ˆ๋ฐฉ์‹์ด๋‹ค.

์ด๋•Œ Protocol, Host, Port๊ฐ€ ๊ฐ™๋‹ค๋ฉด origin์ด ๊ฐ™๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค“ Origin ์˜ˆ์ œ

http://kworld.tistory.com์™€ ๊ฐ™์€ origin์„ ์ฐพ์•„๋ณด์ž!

 

1. https://kworld.tistory.com
2. http://kworld.tistory.com:443
3. http://kworld.tistory.com/10

 

์ •๋‹ต์€ 2,3์ด๋‹ค.

1๋ฒˆ์€ protocol์ด https์ด๋ฏ€๋กœ ๊ฐ™์€ origin์ด ์•„๋‹ˆ๋‹ค.

2๋ฒˆ์€ port 443์ด ๋ถ™์–ด์žˆ์ง€๋งŒ, tistory.com์˜ ๊ธฐ๋ณธ port๊ฐ€ 443์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ origin์ด๋‹ค. ๊ธฐ๋ณธ port๋Š” ํ‰์†Œ์— ์ƒ๋žตํ•˜๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 1๋ฒˆ๊ณผ 2๋ฒˆ์„ ์ฃผ์†Œ์ฐฝ์— ์น˜๊ณ  ๋“ค์–ด๊ฐ€๋ฉด ๊ฐ™์€ ๊ฒฐ๊ณผ์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

3๋ฒˆ์€ path๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์žˆ์ง€๋งŒ, protocol, host, port(์ƒ๋žต๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์Œ)๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ origin์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿค” SOP (Same-origin policy) ๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

์š”์ฆ˜ ์„ธ์ƒ์—๋Š” ์Šค๋ฏธ์‹ฑ ๋ฌธ์ž๊ฐ€ ์ฐธ ๋งŽ๋‹ค. ์ฒญ์ฒฉ์žฅ์ธ ์ค„ ์•Œ๊ณ  ๋ชจ๋ฅด๊ณ  ํด๋ฆญํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ํด๋ฆญํ–ˆ๋”๋‹ˆ hacker.com์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€๊ณ , ๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ  ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” SNS์— ์ด์ƒํ•œ ๊ธ€์ด ์จ์กŒ๋‹ค. ํ•˜์ง€๋งŒ, SOP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” SNS๊ฐ€ https://www.instagram.com/์ด๋ผ๋ฉด, https://www.hacker.com๊ณผ orgin์ด ๋‹ค๋ฅด๋‹ค. ๋”ฐ๋ผ์„œ SOP ๋ณด์•ˆ ์ •์ฑ…์— ์–ด๊ธ‹๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€์ด ์จ์ง€์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

 

SOP ๋ณด์•ˆ ์ •์ฑ…์— ๋”ฐ๋ฅด๋ฉด ๋‹ค๋ฅธ origin์—๋Š” ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ, frontend์™€ backend์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ orgin์— ์ ‘๊ทผํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹ต์ด ๋ฐ”๋กœ CORS(Cross-Origin Resource Sharing)์ด๋‹ค.

 

๐Ÿค” CORS(Cross-Origin Resource Sharing)๋ž€?

Cross-Origin Resource Sharing (CORS) is an HTTP-header based mechanism that allows a server to indicate any origins (domain, scheme, or port) other than its own from which a browser should permit loading resources. CORS also relies on a mechanism by which browsers make a "preflight" request to the server hosting the cross-origin resource, in order to check that the server will permit the actual request. In that preflight, the browser sends headers that indicate the HTTP method and headers that will be used in the actual request.

 

MDN์— ๋”ฐ๋ฅด๋ฉด ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (Cross-Origin Resource Sharing, CORS)๋Š” ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ์ž…๋‹ˆ๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ž์‹ ์˜ ์ถœ์ฒ˜(๋„๋ฉ”์ธ, ํ”„๋กœํ† ์ฝœ, ํฌํŠธ)์™€ ๋‹ค๋ฅผ ๋•Œ ๊ต์ฐจ ์ถœ์ฒ˜ HTTP ์š”์ฒญ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, ๋‹ค๋ฅธ origin์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. "๋ธŒ๋ผ์šฐ์ €์•ผ ๋‚˜ ๋‹ค๋ฅธ origin์ธ๋ฐ ์ ‘๊ทผ ๊ถŒํ•œ ์ข€ ๋ถ€์—ฌํ•ด์ฃผ๋ผ!"

 

๐Ÿค“ CORS ์ ‘๊ทผ์ œ์–ด ์‹œ๋‚˜๋ฆฌ์˜ค ( Examples of access control scenarios)

- ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ(Preflighted requests)

Unlike simple requests, for "preflighted" requests the browser first sends an HTTP request using the 
OPTIONS method to the resource on the other origin, in order to determine if the actual request is safe to send. Such cross-origin requests are preflighted since they may have implications for user data.

 

MDN์— ๋”ฐ๋ฅด๋ฉด "preflighted" request๋Š” “simple requests” ์™€๋Š” ๋‹ฌ๋ฆฌ, ๋จผ์ € OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ๋ฆฌ์†Œ์Šค๋กœ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด ์‹ค์ œ ์š”์ฒญ์ด ์ „์†กํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. cross-origin ์š”์ฒญ์€ ์œ ์ € ๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€๊ฐ™์ด ๋ฏธ๋ฆฌ ์ „์†ก(preflighted)ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, ์ง„์งœ ์š”์ฒญ์„ ํ•˜๊ธฐ ์ „์— "๋‚˜ ์š”์ฒญ ๋ณด๋‚ผ๊ฑด๋ฐ ๋ณด๋‚ด๋„ ๋ผ?"๋ผ๊ณ  ์‚ฌ์ „์— ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ OPTIONS ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋‚ด ๋ฌผ์–ด๋ณธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Preflight ์‚ฌ์ „ ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด ์ง„์งœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. (๋‹น์—ฐํžˆ ๋ฐ˜๋Œ€๋กœ Preflight ์‚ฌ์ „ ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด ์ง„์งœ ์š”์ฒญ์€ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค.)

 

ํด๋ผ์ด์–ธํŠธ๊ฐ€ preflighted ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์–‘์‹์œผ๋กœ ๋ณด๋‚ธ๋‹ค. "๋‚˜ ์ง„์งœ ์š”์ฒญ ์ด๋ ‡๊ฒŒ ๋ณด๋‚ผ๊ฑด๋ฐ ์ง„์งœ ์š”์ฒญ ๋ณด๋‚ผ๊ฑด๋ฐ ๊ดœ์ฐฎ๋‹ˆ?"

PREFLIGHT REQUEST
- Origin
- Access-Control-Request-Method : ์ง„์งœ ์š”์ฒญํ•  method
- Access-Control-Request-Headers : ์ง„์งœ ์š”์ฒญํ•  Headers์— ์ถ”๊ฐ€ํ•  ๊ฒƒ๋“ค

 

๋ฐ‘์˜ ๊ทธ๋ฆผ์˜ ์™ผ์ชฝ ์ตœ์ƒ๋‹จ์˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ด ์–‘์‹์œผ๋กœ ๋ณด๋‚ด๊ณ  ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ์–‘์‹์œผ๋กœ ๋‹ต์žฅ์„ ํ•ด์ค€๋‹ค. "๋„ค๊ฐ€ ๋ณด๋‚ธ preflighted ์š”์ฒญ์— ๋Œ€ํ•œ ๋‹ต์žฅ ๋ณด๋‚ผ๊ฒŒ. ํ—ˆ๊ฐ€ ๋๋Š”์ง€ ์‚ดํŽด๋ด."

PREFLIGHT RESPONSE
- Access-Control-Allow-Orgin : ํ—ˆ๊ฐ€ํ•œ Origin
- Access-Control-Allow-Method : ํ—ˆ๊ฐ€ํ•œ Method
- Access-Control-Allow-Headers : ํ—ˆ๊ฐ€ํ•œ Headers
- Access-Control-Max-Age : Prelight ์‘๋‹ตํ•œ ๊ฒƒ์ด ์บ์‹œ์— ์ €์žฅ๋˜๋Š” ๋ฐ์— ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๋Š”์ง€ ์‹œ๊ฐ„
* Preflight ์š”์ฒญ์€ ์š”์ฒญ์„ ํ•˜๊ณ  ์„ฑ๊ณต์„ ํ•ด์•ผ๋งŒ ์ง„์งœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ Preflight ์š”์ฒญ์€ ์ง„์งœ ์š”์ฒญ๊นŒ์ง€ ๋‘ ๋ฒˆ ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ Preflight ์š”์ฒญ์„ ํ•  ๋•Œ ์บ์‹œ์— ์ €์žฅํ•ด๋†“๊ณ  ์ง„์งœ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์บ์‹œ์— ์ €์žฅํ•ด๋†“์€ ๊ฒƒ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋œ๋‹ค. 

+ Access-Control-Max-Age์— ๋Œ€ํ•œ MDN ๋‚ด์šฉ : ๋‹ค๋ฅธ preflight request๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ , preflight request์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„(์ดˆ)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ์ฝ”๋“œ๋Š” 86400 ์ดˆ(24์‹œ๊ฐ„) ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋ธŒ๋ผ์šฐ์ €์˜ ์ตœ๋Œ€ ์บ์‹ฑ ์‹œ๊ฐ„ ์€ Access-Control-Max-Age ๊ฐ€ ํด์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

 

PREFLIGHT RESPONSE์˜ ํŠน์ง•
- Status code๋Š” 200๋Œ€์—ฌ์•ผ ํ•œ๋‹ค.
- Response body(res.body)๋Š” ๋น„์–ด์žˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

 

- ๋‹จ์ˆœ ์š”์ฒญ(Simple requests)

Preflight ์š”์ฒญ์—†์ด ๋ฐ”๋กœ ์ง„์งœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. Preflight ์—์„œ๋Š” ์ง„์งœ ์š”์ฒญ์„ ํ•˜๊ธฐ ์ „์— "๋‚˜ ์š”์ฒญ ๋ณด๋‚ผ๊ฑด๋ฐ ๋ณด๋‚ด๋„ ๋ผ?"๋ผ๊ณ  ์‚ฌ์ „์— ๋ฌผ์–ด๋ดค๋‹ค๋ฉด, Simple request๋Š” ๋ฐ”๋กœ "๋‚˜ ์š”์ฒญ ๋ณด๋‚ธ๋‹ค"ํ•˜๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋„ ๋˜๋Š” ์ง€ ์•ˆ ๋˜๋Š”์ง€ ๋ฌป์ง€ ์•Š๊ณ  ๋ณด๋‚ด๋ฒ„๋ฆฐ๋‹ค.

 

Simple request๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์–‘์‹์„ ํฌํ•จํ•˜์—ฌ ๋ณด๋‚ด์•ผํ•œ๋‹ค. ์ด ์–‘์‹์˜ ์กฐ๊ฑด๋Œ€๋กœ ๋ณด๋‚ด์•ผ๋งŒ Preflight ์š”์ฒญ ์—†์ด Simple request๋กœ ๋ณด๋‚ด์ง„๋‹ค.

 

- Method : GET, HEAD, POST ์ค‘ ํ•˜๋‚˜
- Heather : Accept, Accept-Language, Content-Language, *Content-type

* Content-Type ๋Š” ๋‹ค์Œ์˜ ๊ฐ’๋งŒ ํ—ˆ์šฉ๋จ
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain

 

๋ฐ‘์˜ ๊ทธ๋ฆผ์—์„œ *๋Š” ๋ชจ๋“  origin์„ ํ—ˆ๊ฐ€ํ•ด์ฃผ๊ฒ ๋‹ค๋Š” ๋ง์ด๋‹ค. ์ฆ‰, client์—์„œ ์š”์ฒญํ•˜๋Š” origin์ธ foo.example๋„ ๋‹น์—ฐํžˆ ํ—ˆ๊ฐ€๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

๐Ÿค” Simple request๋กœ ํ•œ ๋ฒˆ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ Preflight๊ฐ€ ํ•„์š”ํ• ๊นŒ?

 

๋‹ค์‹œ ํ•œ ๋ฒˆ Simple request๋ฅผ ์ •๋ฆฌํ•ด๋ณด์ž. Preflight ์—์„œ๋Š” ์ง„์งœ ์š”์ฒญ์„ ํ•˜๊ธฐ ์ „์— "๋‚˜ ์š”์ฒญ ๋ณด๋‚ผ๊ฑด๋ฐ ๋ณด๋‚ด๋„ ๋ผ?"๋ผ๊ณ  ์‚ฌ์ „์— ๋ฌผ์–ด๋ดค๋‹ค๋ฉด, Simple request๋Š” ๋ฐ”๋กœ "๋‚˜ ์š”์ฒญ ๋ณด๋‚ธ๋‹ค"ํ•˜๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋„ ๋˜๋Š” ์ง€ ์•ˆ ๋˜๋Š”์ง€ ๋ฌป์ง€ ์•Š๊ณ  ๋ณด๋‚ด๋ฒ„๋ฆฐ๋‹ค.

 

๋งŒ์•ฝ CORS์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†๋Š” ์„œ๋ฒ„์— ์ง„์งœ ์š”์ฒญ์„ ๋ฐ”๋กœ ๋ณด๋‚ด๋ฒ„๋ฆฐ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

- ์š”์ฒญ : delete ์ง„์งœ์š”์ฒญ

- ์„œ๋ฒ„ : CORS์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†๋Š” ์„œ๋ฒ„

 

์ผ๋‹จ ์„œ๋ฒ„์—์„œ๋Š” delete ์ง„์งœ ์š”์ฒญ์ด ๋“ค์–ด์™”์œผ๋‹ˆ ์‚ญ์ œ๋ฅผ ํ•ด์„œ ๋””๋น„์—์„œ ์‚ญ์ œํ•ด๋ฒ„๋ฆฐ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์‘๋‹ต์„ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌํ•  ๋•Œ๊ฐ€ ๋ฌธ์ œ์ด๋‹ค. ์„œ๋ฒ„๋Š” ์ผ๋‹จ ์š”์ฒญ์ด ๋“ค์–ด์™”์œผ๋‹ˆ ์ฒ˜๋ฆฌํ•˜๊ธด ํ–ˆ๋Š”๋ฐ ์ด ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์™€๋Š” ๋‹ค๋ฅธ origin์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์„œ๋ฒ„์ด๋‹ค. ์—ฌ๊ธฐ์„œ allow-origin์„ ํ•ด์ฃผ๋ฉด ๋‹ค๋ฅธ origin์ด์–ด๋„ ๊ดœ์ฐฎ๊ฒ ์ง€๋งŒ, CORS๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— allow-origin ์„ค์ •์„ ํ•ด์ค„ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ๋‹ค๋ฅธ origin์ด๋‹ˆ๊นŒ CORS ์—๋Ÿฌ๋ผ๊ณ  ํ•ด์ค€๋‹ค. ์ด๋ฏธ ๋””๋น„์—์„œ๋Š” ์‚ญ์ œํ•ด๋ฒ„๋ ธ๋Š”๋ฐ ํฐ์ผ์ด ๋‚˜๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ CORS์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†๋Š” ์„œ๋ฒ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Preflight๋Š” ๊ผญ ํ•„์š”ํ•œ ์š”์ฒญ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

+ ๋‚˜๋ด„๋‹˜์˜ '๋‚˜๋ด„์˜ CORS' ์œ ํŠœ๋ธŒ ์˜์ƒ, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น์˜์ƒ 'Justin Kim'๋‹˜์˜ ๋Œ“๊ธ€ ์ฐธ๊ณ 

 

- ์ธ์ฆ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ(Requests with credentials)

์ธ์ฆ๊ด€๋ จ header๋ฅผ ํฌํ•จํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ์ด๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ ์ธก
credenttials : include

์„œ๋ฒ„์ธก
Access-Control-Allow-Credentials : true
(Access-Control-Allow-Origin : *๋Š” ์•ˆ ๋œ๋‹ค.)

 

์ฟ ํ‚ค, jwt ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž๋™์œผ๋กœ ๋‹ด์•„์„œ ๋ณด๋‚ด๊ณ  ์‹ถ์„ ๋•Œ credentials(์ธ์ฆ์„œ)๋ฅผ includeํ•˜๋ฉด ์„œ๋ฒ„๊นŒ์ง€ ์ „๋‹ฌํ•ด์ค€๋‹ค.

 

์„œ๋ฒ„์—์„œ๋Š” Access-Control-Allow-Credentials : true๋กœ ๋„ฃ์–ด์ค˜์•ผ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์—ฐํžˆ credential์ด ์žˆ๋Š” ๊ฒƒ๋งŒ ํ—ˆ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— origin์„ *๋กœ ๋ชจ๋“  ๊ฒƒ์„ ํ—ˆ์šฉํ•ด์ฃผ๋ฉด error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Access-Control-Allow-Origin : *๋Š” ์•ˆ ๋œ๋‹ค. ํ—ˆ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ •ํ™•ํ•œ origin (์˜ˆ๋ฅผ ๋“ค์–ด https://kworld.tistory.com)์„ ๋ช…์‹œํ•ด์ค˜์•ผํ•œ๋‹ค.

 

 

๐Ÿ‘CORS ์ฝ”๋“œ ์˜ˆ์‹œ

// npm i cors ์„ค์น˜
// app.js์— requireํ•˜๊ธฐ

const cors = require("cors");

 

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉ

//app.js
// ๋ชจ๋“  ๊ฒฝ์šฐ ๋‹ค ํ—ˆ์šฉ
app.use(cors());
//app.js
// ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ 

const corsOption = {
  origin: "์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์€ ์ฃผ์†Œ",
  credentials: true,
};

app.use(cors(corsOption));

 

 

 

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ:

MDN CORS https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

CORS https://ppojjakcoding.tistory.com/161

CORS https://firework-ham.tistory.com/70

CORS https://da-nyee.github.io/posts/web-cors/

MDN SOP https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

๋‚˜๋ด„์˜ CORS https://youtu.be/-2TgkKYmJt4

728x90