SOP, CORS

๊ถŒํƒœํ˜•ยท2023๋…„ 4์›” 7์ผ
0

์ง€์‹์ •๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
55/72
post-thumbnail

๐Ÿ˜€์ด๋ฒˆ ํฌ์ŠคํŒ…์—” CORS๋ฅผ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. CORS๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์ „์ง€์‹์œผ๋กœ SOP๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค.

SOP๋ž€?

Same-Origin Policy์˜ ์•ฝ์ž๋กœ ์›น ๋ณด์•ˆ ์ •์ฑ… ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋‹ค๋ฅธ ์ถœ์ฒ˜(Origin)์—์„œ ๋กœ๋“œ๋œ ๋ฌธ์„œ๋‚˜ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜๋Š” ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

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

๋งŒ์•ฝ SOP๊ฐ€ ์—†๋‹ค๋ฉด ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ฝ๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๐Ÿ™„โ“Origin์ด๋ž€?
Origin(์ถœ์ฒ˜)์ด๋ž€ URL์˜ ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ๋ช…, ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ•ฉ์นœ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
URL์˜ ๊ตฌ์„ฑ์ด ๊ถ๊ธˆํ•˜๋ฉด URL + URN = URI ? ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด๋ณด์ž

  • ๋™์ผ ์ถœ์ฒ˜์˜ ๋น„๊ต
URL๋™์ผ ์ถœ์ฒ˜ ?์ด์œ 
https://www.domain.com:3000/aboutใ€€ใ€€โญ•ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ ๋ฒˆํ˜ธ ๋™์ผ
https://www.domain.com:3000/about?name=KTHใ€€ใ€€โญ•ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ ๋ฒˆํ˜ธ ๋™์ผ
http://www.domain.com:3000ใ€€ใ€€โŒํ”„๋กœํ† ์ฝœ ๋‹ค๋ฆ„ (http โ‰  https)
https://www.another.co.kr:3000ใ€€ใ€€โŒํ˜ธ์ŠคํŠธ ๋‹ค๋ฆ„
https://www.domain.com:8888ใ€€ใ€€โŒํฌํŠธ ๋ฒˆํ˜ธ ๋‹ค๋ฆ„
https://www.domain.comใ€€ใ€€โŒํฌํŠธ ๋ฒˆํ˜ธ ๋‹ค๋ฆ„ (443 โ‰  3000)

CORS๋ž€?

CORS๋ž€ (Cross-origin resource sharing)์˜ ์•ฝ์ž๋กœ ์ง์—ญํ•˜๋ฉด '๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ '๋ผ ํ•ด์„ํ•˜๊ณ  ๋ง๊ทธ๋Œ€๋กœ ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ์ž์›๋“ค์„ ๊ณต์œ ํ•œ๋‹ค๋Š” ๋œป์„ ๊ฐ€์ง„๋‹ค.

CORS(Cross-Origin Resource Sharing)๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ, ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์œผ๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

CROS๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, ์š”์ฒญ ํ—ค๋”์— Origin ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ํŠน์ • ์ถœ์ฒ˜์—์„œ ์‹คํ–‰์ค‘์ธ ์›น์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ์ด๋‹ค. Origin๊ฐ’์ด๋ž€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„๋ฉ”์ธ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์„œ๋ฒ„์—์„œ๋Š” ์ด Origin๊ฐ’์„ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น ์š”์ฒญ์ด ํ—ˆ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ํ—ˆ์šฉ๋˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰ ๋ธŒ๋ผ์šฐ์ €๋Š” SOP์— ์˜ํ•ด ๊ธฐ๋ณธ์ ์ธ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ž์› ๊ณต์œ ๋ฅผ ๋ง‰์ง€๋งŒ CORS๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ ‘๊ทผ ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

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

CORS์˜ ๋™์ž‘๋ฐฉ์‹

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ HTTP์š”์ฒญ์˜ ํ—ค๋”์— Origin์„ ๋‹ด์•„ ์ „๋‹ฌํ•œ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น์€ HTTP ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ,
    ์ด๋•Œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญ ํ—ค๋”์— Origin ์ด๋ผ๋Š” ํ•„๋“œ์— ์ถœ์ฒ˜๋ฅผ ํ•จ๊ป˜ ๋‹ด์•„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

  1. ์„œ๋ฒ„๋Š” ์‘๋‹ตํ—ค๋”์— Access-Control-Allow-Origin์„ ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ดํ›„ ์„œ๋ฒ„๊ฐ€ ์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•  ๋•Œ ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Origin์ด๋ผ๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์œผ๋กœ '์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜ url'์„ ๋‚ด๋ ค๋ณด๋‚ธ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ Origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ Access-Control-Allow-Origin์„ ๋น„๊ตํ•œ๋‹ค.
  • ์ดํ›„ ์‘๋‹ต์„ ๋ฐ›์€ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž์‹ ์ด ๋ณด๋ƒˆ๋˜ ์š”์ฒญ์˜ Origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ ์‘๋‹ต์˜ Access-Control-Allow-Origin์„ ๋น„๊ตํ•ด๋ณธ ํ›„ ์ฐจ๋‹จํ• ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

    ์œ„์˜ ๊ฒฝ์šฐ์—๋Š” ๋‘˜๋‹ค http://localhost:3000์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•˜๋‹ˆ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฌธ์ œ์—†์ด ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

    ๋งŒ์•ฝ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฒ„๋ฆฐ๋‹ค. (CORS ์—๋Ÿฌ !!)


์‚ฌ์šฉ์˜ˆ์‹œ

๐Ÿ˜€ ํ•„์ž๋Š” Node.js๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  Express ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์„ ๋•Œ npm์œผ๋กœ cors๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์น˜ํ•˜์—ฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

const express = require('express')
const cors = require("cors"); // cors ์„ค์ •์„ ํŽธ์•ˆํ•˜๊ฒŒ ํ•˜๋Š” ํŒจํ‚ค์ง€
const app = express();

// ...

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

๋งŒ์•ฝ ๋ชจ๋“  ์ถœ์ฒ˜์— ๋Œ€ํ•ด์„œ ํ—ˆ์šฉํ•˜๋ ค๋ฉด origin์„ *๋กœ ์„ค๋ช…ํ•˜๋ฉด ๋œ๋‹ค.


์ฐธ๊ณ ์ž๋ฃŒ(์ถœ์ฒ˜)

ํ‹ฐ์Šคํ† ๋ฆฌ Richet์˜ ํ…Œํฌ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… [์›น ๊ฐœ๋ฐœ] CORS๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (what is Cross Origin Request Sharing?) (CORS ํ•œ๋ฒˆ์— ๋ฟŒ์‹œ๊ธฐ) (nginx CORS์—๋Ÿฌ)
Velog sangbin2 ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… CORS ์„ค์ • ๋ฐฉ๋ฒ•
ํ‹ฐ์Šคํ† ๋ฆฌ ์ธํŒŒ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…

profile
22๋…„ 12์›” ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•œ ์‹ ์ž… ๊ฐœ๋ฐœ์ž โ€˜๊ถŒํƒœํ˜•โ€™์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ… ํ•˜๋‚˜ํ•˜๋‚˜ ๋‚ด๊ฐ€ ๋‹ค์‹œ๋ณด๊ธฐ ์œ„ํ•ด ์“ฐ๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๋‹ค๋ฅธ ๋ถ„๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ’ฏ์ปฌ๋ŸฌํฐํŠธ๊ฐ€ ์ž˜ ์•ˆ๋ณด์ด์‹ค ๊ฒฝ์šฐ ๐ŸŒ™๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ด์šฉํ•ด์ฃผ์„ธ์š”.๐Ÿ˜€ ์ง€์ ๊ณผ ์ฐธ๊ฒฌ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€