๋ฒ์จ ์ฝ๋์ ์คํ๋ฆฐํธ๋ฅผ ์์ํ์ง ์ด๋๋ง 4๊ฐ์ ์งธ์ด๋ค.
์ํด๋ฆฌ ํ์ดํผ ์ฃผ์ ๋ ํ์๋ค๊ณผ ํ ์์ผ๋ง๋ค ์๊ธฐํด๋ณด๋ ์๊ฐ์ ๊ฐ๊ณ ์๋ค. ์ํด๋ฆฌ ํ์ดํผ ๋ธ๋ก๊ทธ ์ ๋ก๋๋ ์ ์ํ์ง๋ง..ใ
์ค๋๋ง์ ์ค์ํ ์ฃผ์ ๊ฐ ๋์์ ๋ค์ ๊ธ ์ฐ๊ฒ ๋์๋ค โ๏ธ
๐ฉ๐ซ CORS ์๋ฌ์ ๋ํด ์ค๋ช ํ๊ณ , ์ด๋ป๊ฒ ํด๊ฒฐํ๋ฉด ๋ ์ง ์ค๋ช ํด ์ฃผ์ธ์.
CORS๋ Cross-Origin Resource Sharing์ ์ฝ์์ ๋๋ค.
A Origin์์ B Origin์ผ๋ก ๋ค๋ฅธ Origin์ผ๋ก ์์์ ์์ฒญํ๋ ํ์์ ๋๋ค.
Warning !
Access to fetch at ‘https://myhompage.com’ from origin ‘http://localhost:3000’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.
'https://myhomepage.com'์์ 'https://localhost:3000' ์ถ์ฒ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ ์ก์ธ์ค๊ฐ CORS ์ ์ฑ ์ ์ํด ์ฐจ๋จ๋์์ต๋๋ค. ์์ฒญ๋ ๋ฆฌ์์ค์ 'Access-Control-Allow-Origin' ํค๋๊ฐ ์์ต๋๋ค. ๋ถํฌ๋ช ํ ์๋ต์ด ํ์์ ์ ํฉํ ๊ฒฝ์ฐ, ์์ฒญ ๋ชจ๋๋ฅผ 'no-cors'๋ก ์ค์ ํ์ฌ CORS๊ฐ ๋นํ์ฑํ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค์ญ์์ค.
CORS ์๋ฌ๊ฐ ๋ฐ์ ! ํ๋ฉด ์์ ๊ฐ์ ๋ฌธ๊ตฌ๊ฐ ๋ฌ๋ค.
Access-Control-Allow-Origin์ CORS ์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉ๋๋ HTTP ์๋ต ํค๋ ์ค ํ๋๋ก,
๋ค๋ฅธ ๋๋ฉ์ธ์์์ ์์ฒญ์ ํ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ค ๋๋ฉ์ธ์์ ์์ฒญ์ ํ์ฉํ ๊ฒ์ธ์ง๋ฅผ ๋ช ์ํฉ๋๋ค.
Tip๐ก ์ฌ๊ธฐ์ ๋๋ฉ์ธ๊ณผ Orgin์ ์ฐจ์ด๋ฅผ ์ค๋ช ํด์ฃผ๋ฉด ์ข๋ค
− ๋๋ฉ์ธ์ด๋ ? ์ธํฐ๋ท์์ ์น์ฌ์ดํธ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ด๋ฆ (www.example.com)
- Orgin์ด๋ ? ํ๋กํ ์ฝ(HTTP ๋๋ HTTPS), ๋๋ฉ์ธ(ํธ์คํธ), ๊ทธ๋ฆฌ๊ณ ํฌํธ ๋ฒํธ๋ก ๊ตฌ์ฑ๋ ์น ๋ฆฌ์์ค์ ์ถ์ฒ๋ฅผ ์ ์ํฉ๋๋ค. (http://example.com)
๐ก ๋์ผ ์ถ์ฒ๋ ? ํ๋กํ ์ฝ, ๋๋ฉ์ธ, ํฌํธ๊ฐ ๋ชจ๋ ๋์ผํ ๊ฒฝ์ฐ๋ฅผ ๋งํฉ๋๋ค.
์ด ๋ ์ถ์ฒ(Orgin)๋ ์๋ก ๋ค๋ฅธ ํฌํธ๋ฅผ ๊ฐ์ง๋ก ์์ผ๋ฏ๋ก CORS ์ ์ฑ ์ ๋ฐ๋ผ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋ ค๋ฉด
์๋ฒ์์ CORS ํค๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
CORS๊ฐ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ์์ 3๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค. ๊ทธ ์ค์ ๋จ์ ์์ฒญ์ ๋ํด์ ์์๋ณด์๋ฉด
๋จ์ ์์ฒญ(Simple requests)
์ฃผ๋ชฉํ ์์ฒญ ํค๋๋ Origin ์ผ๋ก, ์์ฒญ์ด https://foo.example ์์ ์์์ ๋ํ๋ ๋๋ค.
์๋ฒ๋ Access-Control-Allow-Origin ํค๋์ ๋ชจ๋ ์ถ์ฒ์์ ํด๋น ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์์์ ์๋ฏธํ๋ Access-Control-Allow-Origin: * ์ ๋ฐํํฉ๋๋ค.
Next.js์์ API Routes๋ฅผ ์ฌ์ฉํ ๋ ๋์ผํ ์ถ์ฒ์ ๋ค๋ฅธ ์ถ์ฒ์์์ ๋ฆฌ์์ค ์์ฒญ
API Routes๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผ ์ถ์ฒ ๋ง ํ์ฉํ๋ฉฐ, CORS ํค๋๋ฅผ ์ง์ ํ์ง ์์ต๋๋ค(opens in a new tab).
์ด๋ฌํ ๋์์ CORS ์์ฒญ ๋์ฐ๋ฏธ(opens in a new tab) ๋ก ์์ฒญ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ธ์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
CORS๋ฅผ ์ค์ ํด์ Access-Control-Allow-Origin ํค๋๋ฅผ ์ถ๊ฐํ๋ฉด, ์ง์ ํ ๋๋ฉ์ธ์์ ์ค๋ ์์ฒญ๋ง ํ์ฉํ๋๋ก ์กฐ์
โฌ๏ธ ์์ฒญ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ธ์ ์ฌ์ฉ์ ์ ์ํ์ฌ ์ฌ์ฉํ ์ฝ๋ ์์.
import Cors from 'cors';
import initMiddleware from '../../lib/init-middleware';
// CORS ์ค์ ์ด๊ธฐํ
const cors = initMiddleware(
Cors({
methods: ['GET', 'POST'],
origin: 'https://allowed-domain.com', // ํ์ฉํ ๋๋ฉ์ธ
})
);
export default async function handler(req, res) {
// ์์ฒญ ํธ๋ค๋ฌ ์ ์ CORS ์ค์ ์ ์ฉ
await cors(req, res);
res.json({ message: 'Hello, CORS is now enabled for allowed-domain.com' });
}
์๋ฒ๋ฅผ ์์ ํ ์ ์๋ค๋ฉด ํ๋ก ํธ ์์ ์์ proxy ์๋ฒ๋ฅผ ๋์์ ๋์ ์์ฒญ์ ๋ณด๋ด๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ฐ์ , CORS ๋ฌธ์ ๋ ๋ธ๋ผ์ฐ์ ์์๋ง ๋ํ๋๋ค. ์๋ฒ์ ์๋ฒ, ๋ณ์กฐ๋ ๋ธ๋ผ์ฐ์ ๋ฉด CORS ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
์ด ๋ proxy ์๋ฒ๋ ํ๋ก ํธ๋ ์ค๋ฆฌ์ง์ด ๊ฐ์์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด ํ๋ก ํธ์ proxy ์๋ฒ ๊ฐ์๋ ์ค๋ฆฌ์ง์ด ๊ฐ๊ธฐ ๋๋ฌธ์ CORS ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ณ proxy ์๋ฒ์ ๋ฐฑ์๋ ์๋ฒ ๊ฐ์๋ Server To Server์ด๊ธฐ ๋๋ฌธ์ CORS ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) - HTTP | MDN
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ์ ์ถ์ฒ๊ฐ ์๋ ๋ค๋ฅธ ์ด๋ค ์ถ์ฒ(๋๋ฉ์ธ, ์คํด ํน์ ํฌํธ)๋ก๋ถํฐ ์์์ ๋ก๋ฉํ๋ ๊ฒ์ ํ์ฉํ๋๋ก ์๋ฒ๊ฐ ํ๊ฐ ํด์ฃผ๋ HTTP
developer.mozilla.org