CORS ์ ์ฑ ์ ์ฐ๋ฆฌ๊ฐ๊ฐ์ ธ์ค๋ ๋ฆฌ์์ค๋ค์ด ์์ ํ์ง ๊ฒ์ฌํ๋ ๊ด๋ฌธ์ด๋ค!
์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ !
ํ์ฌ ๋ธ๋ผ์ฐ์ ๋ก ์ ์์ค์ธ ํ์ด์ง์์ JS๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ๋๋ฉ์ธ ๋๋ ํฌํธ๋ฅผ ๊ฐ์ง ์ฃผ์๋ก ์์ฒญํ๋ ๊ฒฝ์ฐ, ํด๋น ๋ฆฌ์์ค์ ์ ๊ทผ์ ํ์ฉํ๋์ง ํ์ธํด ๋ณด์์ ๋์ด๋ ๋์์ ๋๋ค.
HTML : ๊ธฐ๋ณธ์ ์ผ๋ก Cross-Origin์ ์ฑ ์ ๋ฐ๋ฅธ๋ค.
link ํ๊ทธ์์ ๋ค๋ฅธ origin์ css๋ฑ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ด ๊ฐ๋ฅ
img ํ๊ทธ ๋ฑ์์ ๋ค๋ฅธ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ด ๊ฐ๋ฅ
XMLHttpRequest, Fetch API๋ฑ script ํ๊ทธ ๋ด : ๊ธฐ๋ณธ์ ์ผ๋ก Same-Origin์ ์ฑ ์ ๋ฐ๋ฆ
- JS๋ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ ๋ํ ์์ฒญ์ ๋ณด์์ ์ ์ํ๋ค.(๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์ค์ ์ ํ๋์ ์๋ฒ ์ฐ๊ฒฐ๋ง์ ํ์ฉ!)
์ด์ ์ ๋ธ๋ผ์ฐ์ ์ ์ฑ
์ผ๋ก๋ ์ค๋ฆฌ์ง์ด ๋ค๋ฅด๋ฉด ์์ฒญ์ ์ฃผ๊ณ ๋ฐ์ ์ ์์๋ค.
๊ทธ๋ฌ๋ ์ง๊ธ์ CORS๋ฅผ ํตํด ๋ค๋ฅธ ์ค๋ฆฌ์ง๊ณผ ์์ฒญ์ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ๋์๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ทธ์ด์ ๊ฐ ๋ฌด์์ธ์ง ์์๋ณด์.
์ด์ ์ ์น ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ์ ํต์ ํ๋ ๋ฐฉ์์ ์ดํด๋ณด๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
๋ธ๋ผ์ฐ์ ์์ ์์ฒญ์ ํ๋ฉด HTML Page๋ฅผ ๋ด๋ ค์ฃผ๋ ๋ฐฉ์์ด์๋ค.
ํ์ง๋ง ์น ์ฌ์ดํธ์์ ๋จ์ ๋ฌธ์ ์ ๊ณต๋ง ํ๋๊ฒ ์๋ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ด ์์๋๋ฉด์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ์กด์ ๊ฐ์ง๊ณ ์์๋ ๋ณด์ ์ ์ฑ ์ผ๋ก ์ธํ ๋ถํธํจ์ด ๋ฐ์์ ํ์๋ค.
์ฌ๋๋ค์ Web Server๋ฅผ ๊ฑฐ์น์ง ์๊ณ ํ๋ฒ์ ํต์ ํ๊ธฐ๋ฅผ ์ํ์ผ๋ฉฐ,
๊ฐ๋ฐ์๋ค์ JSONP๋ผ๋ ์ฐํ์ ์ธ ๋ฐฉ๋ฒ์ ์ ํํ์ฌ ํต์ ์ ํ์๋ค.
ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์ ์ฅ์์๋ ์ด๋ฐ ์ฐํ์ ์ธ ๋ฃจํธ๋ก ๋ณด์์ ๋ฌด๋ ฅํ ์ํค๋ ๊ฒ์ ๋ฐฉ์นํ ์๋ ์์๋ค.
๊ทธ๋ ๋ค๊ณ ๋๋ฌด ๋ง์ ์์๊ฐ ์์๊ธฐ์ ์ด ๋ฐฉ์์ ๋ง์๋ฒ๋ฆด ์๋ ์์๋ค.
๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ์์ ์ฐํ์ ์ธ ๋ฃจํธ๊ฐ ์๋ ๊ณต์์ ์ธ ๋ฃจํธ๋ฅผ ์ ์ํด์ฃผ์๋ค.
๊ทธ๊ฒ ๋ฐ๋ก CORS์ด๋ค.๐ค
: Protocol + Host + Port
CORS preflight
) ๐ ๋น๊ตํ ๋ง์ฝ ์ ํจํ์ง ์๋ค๋ฉด ๊ทธ ์๋ต์ ์ฌ์ฉํ์ง ์๊ณ ๋ฒ๋ฆฐ๋ค.(์ฐจ๋จ!)
์๋น ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ , ๋ฐ๋ก HTTP Request๋ฅผ ํ๋ ๋ฐฉ์.
์ด ๋ฐฉ์์ ๋ฐ์ ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ์ ์ฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ์๋น์์ฒญ์ HTTP method ์ค OPTIONS๋ฅผ ์ด์ฉํด์ ๋ค์๊ณผ ๊ฐ์ ํ์ธ ์ฌํญ์ ๊ฒ์ฌํ๋ค.
- Origin : ์ถ์ฒ ์ ๋ณด (์๋ฒ์์ ํ๋ฝํ ์ถ์ฒ์ ์์ฒญ์ธ์ง ๊ฒ์ฌ)
- Access-Control-Request-Method : HTTP METHOD๊ฐ ์ ํจํ์ง ๊ฒ์ฌ
- Access-Control-Request-Headers : ๋ณธ ์์ฒญ์ HTTP์ HEADER๊ฐ ์ ํจํ์ง ๊ฒ์ฌ
์๋ฒ๋ ํด๋น ์๋น์์ฒญ์ ๋ํ ์๋ต์ผ๋ก ํ๋ฝ๋ ์ ์ฑ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
- Access-Contorl-Allow-Origin : ์๋ฒ๊ฐ ํ๋ฝํ ์ถ์ฒ๋ค (Protocol + Host + Port)
- Access-Control-Allow-Methods : ํ๋ฝํ HTTP Method ๋ฆฌ์คํธ ์
- Access-Control-Allow-Headers : ํ์ฉ๋๋ HEADERS ์ ๋ณด
( ' * ' ์์ผ๋ ์นด๋์ ์ ๋ถ ํ์ฉํ์ง๋ง, Authorization์ ๋ฐ๋ก ๋ช ์ํด์ผ๋จ)- Access-Control-Max-Age : ์๋ฒ๊ฐ preflight์์ฒญ์ ๋ํ ์๋ต์ ์๋ช (์ด ๋จ์)
โ๏ธํ์ง๋ง, ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ด ์๋น์์ฒญ์ ์๋ต ์ฑ๊ณต์ฌ๋ถ์ ์๊ด์์ด CORS์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ๊ฐ๋์ฉ Preflight Request๊ฐ 200 ์ฑ๊ณต ์๋ต์ ์ฃผ์์ด๋ ๋ธ๋ผ์ฐ์ ์ CORS์๋ฌ๊ฐ ๋์ ๋ง์ด ๋นํฉํ๋ค.
์ด๋ ๊ฒ ๋๋ ์ด์ ๋ ์ผ๋จ CORS ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์์ ์ด ์๋น ์์ฒญ์ ๋ฐ๊ณ ๋ ์งํ์ด๊ธฐ ๋๋ฌธ์ด๋ค. preflight request์์ ๊ฒ์ฌํ ์ ๋ณด์์ ๋ ์ถ๊ฐ๋ ์ ๋ณด๊ฐ ์๊ฑฐ๋, ๋ฉ์ธ ์์ฒญ์ URL์ด ๋ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ ์์ฒญ์์ CORS ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด Preflight Request ๋ฐฉ์์ Simple Request ๋ฐฉ์์ ์ ์ฉ๋ ์ ์์ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ, Simple Request์ ํด๋น ์ฌํญ์ด ์๋ค๋ฉด ์๋น์์ฒญ์ด ๋ฐ์ ๋ฉ๋๋ค.
์ธ์ฆ๋ ์์ฒญ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๋ฆฌ์์ค ์์ฒญ์ธ XMLHttpRequest ๊ฐ์ฒด๋ fetch ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ฟ ํค๋ ํค๋๋ฅผ ์์ฒญ์ ๋ด์ง์๊ณ , credentials์ต์
์ ์ ์ฉํด์ผ์ง ๋ด์ ์ ์๋ค.
์ด credential์ 3๊ฐ์ง ์ต์ ์ ๊ฐ์ง๋ฉฐ ๋ค์๊ณผ ๊ฐ์ด fectch๋ฅผ ์ฌ์ฉํ ๋ ์ต์ ๊ฐ์ ์ค์ ํ์ฌ ์์ฒญ์ ๋ณด๋ผ์ ์๋ค.
โ๏ธcredentials ์ต์ ์ include๋ก ์ค์ ํ์ ๋, CORS ์ ์ฑ ์ 2๊ฐ์ง ํญ๋ชฉ์ด ๋ ์ถ๊ฐ๋๋ค.
1. Access-Control-Allow-Origin์๋ *๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ช ์์ ์ธ URL์ด์ด์ผํ๋ค.
2. ์๋ต ํค๋์๋ ๋ฐ๋์ Access-Control-Allow-Credentials: true๊ฐ ์กด์ฌํด์ผํ๋ค.
res.setHeader(โAccess-Control-Allow-originโ, โ*โ);
//'*'์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ origin์์ ์ค๋ ์์ฒญ์ ํ์ฉํ๋ค๋ ์๋ฏธ๋ก,
// ๋น์ฅ์ ํธํด๋ ์ด์ํ ์ถ์ฒ์์ ์ค๋ ์์ฒญ๊น์ง ๋ชจ๋ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณด์์ด ํ์ ํด์ง!
// ๊ทธ๋ฌ๋ ์กฐ๊ธ ๋ถํธํ๋๋ผ๋ ํน์ ๋๋ฉ์ธ๋ง ์ถ๊ฐํ๋ ๊ฑธ๋ก ํ๋๊ฒ ์ข์!
res.setHeader(โAccess-Control-Allow-Credentialsโ โtrueโ); //์ฟ ํค ์ฃผ๊ณ ๋ฐ๊ธฐ ํ์ฉ
ํฐ๋ฏธ๋์ npm i cors ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด CORS ๋ชจ๋ ์ค์น
๋ฏธ๋ค์จ์ด ์ถ๊ฐ
๋ชจ๋ ์์ฒญ ํ์ฉ :
app.use(cors());
ํน์ ๋๋ฉ์ธ๋ง ํ์ฉ:
const corsOption = {
origin: "https://www.test-cors.org",
credentials: true,
};
app.use(cors(corsOption));
ํญํดํก์ ์ค๋นํ๋ฉฐ CORS์ ๋ํด ์ง๊ธ!์ง๊ธ!ํ๊ฒ ๋ค์ ๊ฒ๊ฐ๋ค.
์ค๋ฆฌ์งํฌ๋ผ๋ ๋ณ์นญ๋ ์ป์ผ๋ฉฐ ๋๋ฌ๋ CORSํญํดํก!
๊ทธ๋๋ ์ด ์๋ฌ์ ๋ํด ์ ๋๋ก ์๊ณ ๊ฐ๊ฒ ๋์ด์ ๋คํ์ด๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค.
๋ด๊ฐ ์ผ์ ํ ๋, ํ๋ก ํธ์์ ์ด๋ฌํ ์๋ฌ๊ฐ ๋ด๋ค๋ฉด ๋๊ตฌ์ ํ๋ง ํ ๊ฒ ์๋๋ผ ์๋ก ํ์ธํ๊ณ ๋ง์ถฐ๋๊ฐ์ผํ๋ค๋ ๊ฑธ ๋์ฑ ๋๋ผ๊ฒ ๋์๊ณ , ๋์ฑ ์๋ก๋ฅผ ์ดํดํ ์ ์๋ ๊ณ๊ธฐ๊ฐ ๋๋ ๊ฒ๊ฐ์๋ค.
ํ์คํ ์์๋๋ณด๋ค ํจ์ฌ ์ฑ์ฅํ๋ค๋ ๋๋์ด ๋ค์ด ๊ธฐ๋ถ์ด ๊ต์ฅํ ์ข๋ค.
๋์์ ๊ต์ฅํ ์นญ์ฐฌํด!
์ ๋ฐ ๋ํํด์ง์ง๋ง ๋ง๊ณ ๋๊น์ง ํด๋ณด์!๐ค