4 minute read


์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด, ๋†’์€ ํ™•๋ฅ ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๋Š” ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.

001

์ด ์—๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ CORS ์—๋Ÿฌ๋กœ, CORS ์ •์ฑ…์„ ์œ„๋ฐ˜ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ด๋‹ค.

์›น์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ ์ œํ•œ๊ณผ ๊ด€๋ จ๋œ ์ •์ฑ…์œผ๋กœ CORS, SOP ๋‘ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ์ •์ฑ…๊ณผ CORS ์—๋Ÿฌ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.


๐Ÿ‘‰ ์ถœ์ฒ˜(Origin)

002

์ถœ์ฒ˜๋Š” URL์—์„œ ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ๋กœ ์กฐํ•ฉ๋œ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค. ์…‹ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅด๋ฉด ๋™์ผํ•œ ์ถœ์ฒ˜๋กœ ๋ณด์ง€ ์•Š๋Š”๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €์˜ ์ฝ˜์†” ์ฐฝ์— location.origin์„ ์‹คํ–‰ํ•˜๋ฉด ์ถœ์ฒ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


โ–ถ๏ธ ๋™์ผ ์ถœ์ฒ˜, ๊ต์ฐจ ์ถœ์ฒ˜

  • https://www.example.com:443/dir, http://www.example.com:443/dir
    โ†ณ ํ”„๋กœํ† ์ฝœ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ต์ฐจ ์ถœ์ฒ˜์ด๋‹ค.
  • https://www.example.com:443/dir, https://www.otherexample.com:443/dir
    โ†ณ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ต์ฐจ ์ถœ์ฒ˜์ด๋‹ค.
  • https://www.example.com:443/dir, https://www.example.com:443/dir2
    โ†ณ ๊ฒฝ๋กœ๋งŒ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผ ์ถœ์ฒ˜์ด๋‹ค.
  • https://www.example.com:443/dir, https://www.example.com:443/dir/inner
    โ†ณ ๊ฒฝ๋กœ๋งŒ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผ ์ถœ์ฒ˜์ด๋‹ค.
  • https://www.example.com:443/dir, https://www.example.com:80/dir
    โ†ณ ํฌํŠธ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ต์ฐจ ์ถœ์ฒ˜์ด๋‹ค.
  • https://www.example.com:443/dir, https://www.example.com/dir
    โ†ณ ๋™์ผ ์ถœ์ฒ˜์ด๋‹ค. (https ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ํฌํŠธ๋Š” 443)


๐Ÿ‘‰ SOP (Same-Origin Policy)

SOP๋ž€ Same-Origin-Policy์˜ ์ค„์ž„๋ง๋กœ, ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์„ ๋œปํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ ๋ณด์•ˆ ๊ด€๋ จ ์ •์ฑ…์€ SOP(Same-Origin Policy)์™€ CORS(Cross Origin Resource Sharing)์ด ์žˆ๋‹ค.

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

ํ•œ๋งˆ๋””๋กœ โ€œ๊ฐ™์€ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋งŒ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹คโ€, โ€œ๋™์ผํ•œ ์ถœ์ฒ˜๋กœ๋งŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹คโ€๋ผ๋Š” ์ •์ฑ…์ด๋‹ค.


์ด SOP๋Š” ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ์ •์ฑ…์ด์ง€๋งŒ, ์›น์—์„œ๋Š” ๋‹ค๋ฅธ ์ถœ์ฒ˜์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ด ์•„์ฃผ ํ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— SOP๋Š” ๋ณ„๋„์˜ ์˜ˆ์™ธ์‚ฌํ•ญ์„ ๋‘๊ณ  ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ๋„ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋กํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ CORS ์š”์ฒญ์„ ์ง€ํ‚จ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด๋‹ค.

Generally, reading information from another origin is forbidden. However, an origin is permitted to use some kinds of resources retrieved from other origins. For example, an origin is permitted to execute script, render images, and apply style sheets from any origin. Likewise, an origin can display content from another origin, such as an HTML document in an HTML frame. Network resources can also opt into letting other origins read their information, for example, using Cross-Origin Resource Sharing.

์ฆ‰, ์ด ์—๋Ÿฌ๋Š” SOP ๋•Œ๋ฌธ์— ์ผ์–ด๋‚˜๊ฒŒ ๋œ ์—๋Ÿฌ์ด๋ฉฐ CORS๋Š” ์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.


โ–ถ๏ธ SOP์€ ์™œ ์ƒ๊ฒจ๋‚˜๊ฒŒ ๋˜์—ˆ์„๊นŒ?

๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์€ ์ž ์žฌ์ ์œผ๋กœ ํ•ด๋กœ์šธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ค„์—ฌ์ค€๋‹ค.
SOP์„ ํ†ตํ•ด ํ•ดํ‚น ๋“ฑ์˜ ์œ„ํ˜‘์—์„œ ๋ณด๋‹ค ๋” ์•ˆ์ „ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


SOP ์ •์ฑ…์ด ์—†๋Š” ์ƒํ™ฉ์—์„œ ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ„ํ—˜์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.

  • XSS (Cross-Site Scripting)
    ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์›น ์‚ฌ์ดํŠธ๋ฅผ ์‹ ์šฉํ•˜๋Š” ์ ์„ ๋…ธ๋ ค, ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์›น ์‚ฌ์ดํŠธ์— ์‹ฌ์–ด ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•
  • CSRF (Cross-Site Request Forgery)
    ํŠน์ • ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹ ์šฉํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋…ธ๋ ค, ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„(์ˆ˜์ •, ์‚ญ์ œ, ๋“ฑ๋ก ๋“ฑ)๋ฅผ ํŠน์ • ์›น ์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•


๐Ÿ‘‰ CORS (Cross-Origin Resource Sharing)

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


โ–ถ๏ธ CORS ๋™์ž‘ ๋ฐฉ์‹

CORS์˜ ๋™์ž‘ ๋ฐฉ์‹์—๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. Preflight Request

์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „, OPTIONS ๋ฉ”์„œ๋“œ๋กœ ์‚ฌ์ „ ์š”์ฒญ์„ ๋ณด๋‚ด ํ•ด๋‹น ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ๊ฒƒ

003

์œ„ ์ด๋ฏธ์ง€ ํ๋ฆ„๊ณผ ๊ฐ™์ด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์— ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „ Preflight ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต ํ—ค๋”์˜ Access-Control-Arrow-Origin์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ ์ถœ์ฒ˜๊ฐ€ ๋Œ์•„์˜ค๋ฉด ์‹ค์ œ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

004

๋งŒ์•ฝ ์š”์ฒญ์„ ๋ณด๋‚ธ ์ถœ์ฒ˜๊ฐ€ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ CORS ์—๋Ÿฌ๋ฅผ ๋„์šฐ๊ฒŒ ๋˜๊ณ , ์‹ค์ œ ์š”์ฒญ์€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

Preflight Request๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

  • ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ถŒํ•œ ํ™•์ธ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ์š”์ฒญ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ†ต์งธ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ ๋ณด๋‹ค ๋ฆฌ์†Œ์Šค ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค.
  • CORS์— ๋Œ€๋น„๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์€ ์„œ๋ฒ„๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค. CORS ์ด์ „์— ๋งŒ๋“ค์–ด์ง„ ์„œ๋ฒ„๋“ค์€ SOP ์š”์ฒญ๋งŒ ๋“ค์–ด์˜ค๋Š” ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜๊ณ  ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ์ถœ์ฒ˜์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ๋Œ€๋น„๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์•˜๋‹ค.

005

์ด๋Ÿฐ ์„œ๋ฒ„์— ๋ฐ”๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด, ์‘๋‹ต์„ ๋ณด๋‚ด๊ธฐ ์ „ ์šฐ์„  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์‘๋‹ต์„ ๋ฐ›์€ ํ›„์—์•ผ CORS ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋„์šด ํ›„์—๋Š” ์ด๋ฏธ ์š”์ฒญ์ด ์ˆ˜ํ–‰๋œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ CORS์— ๋Œ€๋น„๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์€ ์„œ๋ฒ„๋ผ๋„ Preflight ์š”์ฒญ์„ ๋จผ์ € ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด, ๊ทธ ์š”์ฒญ์—์„œ CORS ์—๋Ÿฌ๋ฅผ ๋„์šฐ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰๋˜์„  ์•ˆ ๋˜๋Š” Cross-Origin ์š”์ฒญ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ Preflight ์š”์ฒญ์ด CORS์˜ ๊ธฐ๋ณธ ์‚ฌ์–‘์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜์—ˆ๋‹ค.

2. ๋‹จ์ˆœ ์š”์ฒญ (Simple Request)

๋‹จ์ˆœ ์š”์ฒญ์€ ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์„ ์ƒ๋žตํ•˜๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

006

์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • GET, HEAD, POST ์š”์ฒญ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.
  • ์ž๋™์œผ๋กœ ์„ค์ •๋˜๋Š” ํ—ค๋” ์™ธ์—, Accept, Accept-Language, Content-Language, Content-Type ํ—ค๋”์˜ ๊ฐ’๋งŒ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Content-Type ํ—ค๋”์—๋Š” application/x-www-form-urlencoded, multipart/form-data, text/plain ๊ฐ’๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.

3. ์ธ์ฆ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ (Credentialed Request)

์š”์ฒญ ํ—ค๋”์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์•„ ๋ณด๋‚ด๋Š” ์š”์ฒญ์ด๋‹ค. ๋ฏผ๊ฐํ•œ ์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํ”„๋ก ํŠธ, ์„œ๋ฒ„ ์–‘์ธก ๋ชจ๋‘ CORS ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

  • ํ”„๋ก ํŠธ ์ธก์—์„œ๋Š” ์š”์ฒญ ํ—ค๋”์— withCredentials : true ๋ฅผ ๋‹ด์•„์ค˜์•ผ ํ•œ๋‹ค.
  • ์„œ๋ฒ„ ์ธก์—์„œ๋Š” ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Credentials : true๋ฅผ ๋‹ด์•„์ค˜์•ผ ํ•œ๋‹ค.
  • ์„œ๋ฒ„ ์ธก์—์„œ Access-Control-Allow-Origin์„ ์„ค์ •ํ•  ๋•Œ, ๋ชจ๋“  ์ถœ์ฒ˜๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๋œป์˜ ์™€์ผ๋“œ์นด๋“œ(*)๋กœ ์„ค์ •ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋งŒํผ ์ถœ์ฒ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.


โ–ถ๏ธ CORS ์„ค์ • ๋ฐฉ๋ฒ•

1. Node.js ์„œ๋ฒ„

const http = require("http");

const server = http.createServer((request, response) => {
  // ๋ชจ๋“  ๋„๋ฉ”์ธ
  response.setHeader("Access-Control-Allow-Origin", "*");

  // ํŠน์ • ๋„๋ฉ”์ธ
  response.setHeader("Access-Control-Allow-Origin", "https://codestates.com");

  // ์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ์„ ๋ฐ›์„ ๊ฒฝ์šฐ
  response.setHeader("Access-Control-Allow-Credentials", "true");
});

2. Express ์„œ๋ฒ„

const cors = require("cors");
const app = express();

//๋ชจ๋“  ๋„๋ฉ”์ธ
app.use(cors());

//ํŠน์ • ๋„๋ฉ”์ธ
const options = {
  origin: "https://codestates.com", // ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋„๋ฉ”์ธ
  credentials: true, // ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Credentials ์ถ”๊ฐ€
  optionsSuccessStatus: 200, // ์‘๋‹ต ์ƒํƒœ 200์œผ๋กœ ์„ค์ •
};

app.use(cors(options));

//ํŠน์ • ์š”์ฒญ
app.get("/example/:id", cors(), function (req, res, next) {
  res.json({ msg: "example" });
});

Reference

[Browser] CORS๋ž€?

MDN : ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…

MDN : ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  (CORS)

Understanding โ€œsame-siteโ€ and โ€œsame-originโ€

CORS๋Š” ์™œ ์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋ฅผ ํž˜๋“ค๊ฒŒ ํ•˜๋Š”๊ฑธ๊นŒ?

Leave a comment