Ajax์—์„œ ํ•„์š”ํ•œ SOP(Same Origin Policy), CORS(Cross-Origin Resource Sharing) ์ •๋ฆฌ

SOP, COP

Same Origin Policy

document ๊ฐ์ฒด๋Š” ์ถœ์‹ ์ธ origin์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด๋Š” js์—์„œ `document.location.origin`์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. document ๋‚ด์—์„œ ๋ฆฌ์†Œ์Šค๋“ค๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ, origin์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ ์ œํ•œ์„ ๋‘๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด SOP(Same Origin Policy)์ด๋‹ค.

 

Origin ํŒ๋‹จ

Origin์ด ๊ฐ™์€ ์ง€๋Š” Protocol, Host, Port๋กœ ํŒ๋‹จํ•˜๋Š”๋ฐ url ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

http://localhost:3000
Protocol://Host:Port

์„ธ ๊ฐ€์ง€๊ฐ€ ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ Origin์ด๋ผ๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

IE๋Š” ์–‘์ชฝ ๋„๋ฉ”์ธ ๋ชจ๋‘ ๋†’์Œ ๋‹จ๊ณ„์˜ ๋ณด์•ˆ ์ˆ˜์ค€์ผ ๊ฒฝ์šฐ Same Origin Policy๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๊ณ , ํฌํŠธ๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ Same Origin์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

IE...ใ…‚ใ„ทใ…‚ใ„ท

 

SOP๊ฐ€ ์—†๋‹ค๋ฉด?

SOP๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด Same origin์ด ์•„๋‹ ๋•Œ, ํ•ด์ปค๊ฐ€ ์ž์‹ ์˜ ์„œ๋ฒ„ url๋กœ ์œ ์ €๋ฅผ ์œ ๋„ํ•˜๋ฉด ํ•ด๋‹น document๊ฐ€ ์œ ์ €์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋  ํ…๋ฐ, document์— ํ•ด๋‹น ์œ ์ €์˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๊ธ์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐœ์ธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

SOP ์ ์šฉ

ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์˜ ๋น„๋””์˜ค๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ๋„ ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๋กœ link๋ฅผ ๊ฑธ์–ด ์ด๋™ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ๋“ค์€ SOP์— ์˜ํ–ฅ์„ ์•ˆ ๋ฏธ์น˜๋Š” ๊ฒƒ์ผ๊นŒ?

  • Cross Origin Writes

    • ์“ฐ๊ธฐ๋Š” ๋ณดํ†ต ํ—ˆ์šฉ๋œ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋งํฌ๋‚˜ redirect, form ์ œ์ถœ ๋“ฑ์— ์žˆ์–ด์„œ ์ž์œ ๋กญ์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ์ด๋“œ์—์„œ preflight๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

    • preflight๋ž€ ์‹ค์ œ request๋ฅผ ๋ณด๋‚ด๋„ ๊ดœ์ฐฎ์€์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด, option method๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ request๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

  • Cross Origin Inserts

    • ์‚ฝ์ž…์€ ๋ณดํ†ต ํ—ˆ์šฉ๋œ๋‹ค. iframe์ด๋‚˜ video, img, embed ๋“ฑ์˜ ํƒœ๊ทธ๋กœ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  • Cross Origin Read

    • ์ฝ๊ธฐ๋Š” ๋ถˆํ—ˆํ•˜์ง€๋งŒ CORS(Cross Origin Resource Sharing)๋ฅผ ์ด์šฉํ•ด ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ตญ SOP๋ฅผ ๋”ฐ๋ฅด๋Š” Web API๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด, api ํ˜ธ์ถœ ๋“ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ ๊ฐ™์€ origin์ด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ origin์ผ ๊ฒฝ์šฐ cors ์˜ต์…˜์ด ํ™•์ธ๋˜์–ด์•ผํ•œ๋‹ค. ์ด๋Ÿฌํ•œ API๋“ค์—๋Š” Fetch API, XMLHttpRequest, axios ๋“ฑ์ด ์žˆ๋‹ค.

Ajax ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

 

Ajax(Asynchronous Javascript And Xml)

Ajax๋Š” js๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๊ฐ„์˜ xml(Extensible Markup Language)๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

hini7.tistory.com

CORS๋Š” Cross-Origin Resource Sharing์œผ๋กœ origin์ด ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ •์ฑ…์ด๋‹ค. SOP์—์„œ๋Š” ์›๋ž˜ ๋‹ค๋ฅธ origin์˜ ์‚ฌ์ดํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์—†๋Š”๋ฐ, CORS๋ฅผ ์„ค์ •ํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Preflight

๋‹ค๋ฅธ origin์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ๋Š” ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , ๋ธŒ๋ผ์šฐ์ € ์ž…์žฅ์—์„œ๋„ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ œ๋Œ€๋กœ ๋ฐ›์„ ์ˆ˜ ์—†์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ œ๋Œ€๋กœ ๋œ ๋™์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ €ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŒ… ๊ณผ์ •์ด ๋ฐ”๋กœ Preflight์ด๋‹ค.

๊ฐ€๋” api ์š”์ฒญ ์‹œ get method๋งŒ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋Š” 404 ์—๋Ÿฌ๊ฐ€ ๋œฐ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Network๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‚ด๊ฐ€ ์ง€์ •ํ•œ method๊ฐ€ ์•„๋‹Œ OPTION method๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ ๊ฒƒ์ด ๋ณด์ธ๋‹ค.

์ด๋Š” Preflight๋ฅผ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์‰ฝ๊ฒŒ ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•  method๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ํ—ˆ์šฉํ•˜๋Š” method๋ฅผ response๋กœ ๋ณด๋‚ด์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•  ๋‹ค์Œ ์š”์ฒญ์ด ์œ ํšจํ•œ ์ง€์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•ด์ฃผ๋Š” ์‹์ด๋‹ค.

 

CORS ๋™์ž‘

CORS(Cross-Origin Resource Sharing)๋Š” HTTP header๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค header๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ• ๊นŒ?

์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” HTTP response header์˜ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Access-Control-Allow-Origin : ์–ด๋–ค origin์˜ data ์š”์ฒญ์„ ํ—ˆ์šฉํ• ์ง€

  • Access-Control-Expose-Headers : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” header ์ง€์ • ๊ฐ€๋Šฅ

  • Access-Control-Max-Age : preflight์˜ ์š”์ฒญ์ด ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์บ์‹œ๋˜๋Š”์ง€

  • Access-Control-Allow-Credentials : ์ธ์ฆ ์ •๋ณด ์„ธํŒ… ๊ฐ€๋Šฅ

    ์ฟ ํ‚ค ์„ธํŒ… ํฌ์ŠคํŒ…

  • Access-Control-Allow-Methods : ๊ฐ€๋Šฅํ•œ ์š”์ฒญ method

  • Access-Control-Allow-Headers : ํ—ˆ์šฉํ•˜๋Š” header ์ง€์ • ๊ฐ€๋Šฅ

 

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” HTTP request header์˜ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • origin

  • Access-Control-Request-Method : preflight์—์„œ ์‹ค์ œ ์š”์ฒญ์— ์–ด๋–ค method๊ฐ€ ์“ฐ์ผ ๊ฒƒ์ธ์ง€ ์˜ˆ๊ณ 

    • ์„œ๋ฒ„์—์„œ๋Š” Access-Control-Allow-Methods๋กœ ๋‹ต๋ณ€ํ•จ
  • Access-Control-Request-Headers : preflight์—์„œ ์‹ค์ œ ์š”์ฒญ์— ์–ด๋–ค header๊ฐ€ ์“ฐ์ผ ๊ฒƒ์ธ์ง€ ์˜ˆ๊ณ 

    • ์„œ๋ฒ„์—์„œ๋Š” Access-Control-Allow-Headers๋กœ ๋‹ต๋ณ€ํ•จ

 

๊ฒฐ๋ก ์ ์œผ๋กœ same origin์ด ์•„๋‹Œ cross origin์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ, preflight๋กœ ๋จผ์ € ํ…Œ์ŠคํŒ…์„ ํ•˜๋ฉฐ ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ header๋ฅผ ํ†ตํ•ด ํ•ด๋‹น origin์˜ ์š”์ฒญ์ด ์˜ฌ๋ฐ”๋ฅด๊ณ  ์ดํ–‰๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์†Œํ†ตํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•