Seize your moment! ๐Ÿ‘พ

์•ˆ๋…•ํ•˜์„ธ์š”. Eric์ž…๋‹ˆ๋‹ค. ์ œ ๋ธ”๋กœ๊ทธ์— ๋ฐฉ๋ฌธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ๊ฐœ๋ฐœ๊ณต๋ถ€/Web

[Eric's Web] NGINX ์„ค์น˜ ๋ฐ CORS ์„ค์ • ๋ฐฉ๋ฒ•

Eric_ko 2024. 6. 22. 16:49

์•ˆ๋…•ํ•˜์„ธ์š”!
Eric์ž…๋‹ˆ๋‹ค!
์˜ค๋Š˜ ์•Œ์•„๋ณผ ๋‚ด์šฉ์€
์–ผ๋งˆ์ „์— ํšŒ์‚ฌ์—์„œ CORS๋ฅผ ์„ธํŒ…ํ•˜๋ ค๋Š”๋ฐ,
Server์—์„œ ์„ธํŒ…ํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ์ด์—ˆ์–ด์„œ,
NGINX์— CORS๋ฅผ ์„ธํŒ…ํ•ด์„œ CORS ์„ธํŒ…์„ ํ•ด๋ณด๊ณ ์ž ์‹œ๋„ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค!

์ด๋ฒˆ๊ธฐํšŒ์— NGINX ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ  ์ €์™€ ๊ฐ™์ด NGINX ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์‹œ์ฃ !

NGINX ์„ค์น˜ ๋ฐ CORS ์„ค์ • ๋ฐฉ๋ฒ•

์†Œ๊ฐœ

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ CORS(Cross-Origin Resource Sharing)๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. CORS๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์œผ๋กœ, ์ด๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด API ์š”์ฒญ์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Ubuntu ํ™˜๊ฒฝ์—์„œ NGINX๋ฅผ ์„ค์น˜ํ•˜๊ณ  CORS ์„ค์ •์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. NGINX ์„ค์น˜

๋จผ์ € NGINX๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด NGINX๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sudo apt update
sudo apt install nginx -y

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด NGINX๊ฐ€ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

sudo systemctl status nginx

NGINX๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด, ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ NGINX ํ™˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. NGINX ์„ค์ • ํŒŒ์ผ ์œ„์น˜

NGINX ์„ค์ • ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ /etc/nginx/nginx.conf์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์„œ๋ฒ„ ๋ธ”๋ก ์„ค์ •์€ /etc/nginx/sites-available/ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. CORS ์„ค์ •

์ด์ œ NGINX๋ฅผ ํ†ตํ•ด CORS๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. CORS ์„ค์ •์€ NGINX์˜ http, server, ๋˜๋Š” location ๋ธ”๋ก์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” /etc/nginx/sites-available/default ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ๊ธฐ๋ณธ ์„ค์ •์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์—ด๊ธฐ

sudo nano /etc/nginx/sites-available/default

์„ค์ • ์ถ”๊ฐ€

๋‹ค์Œ์€ CORS ์„ค์ • ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ server ๋ธ”๋ก ์•ˆ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

server {
    listen 80;
    server_name example.com;

    location / {
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
            add_header 'Access-Control-Max-Age' 86400;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

        proxy_pass http://your_backend_server;
    }
}

์„ค์ • ์„ค๋ช…

  • if ($request_method = 'OPTIONS'): ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ(preflight) ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • add_header 'Access-Control-Allow-Origin' '*': ๋ชจ๋“  ๋„๋ฉ”์ธ์—์„œ์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋„๋ฉ”์ธ๋งŒ ํ—ˆ์šฉํ•˜๋ ค๋ฉด '*' ๋Œ€์‹  ํ•ด๋‹น ๋„๋ฉ”์ธ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS': ํ—ˆ์šฉํ•  HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • add_header 'Access-Control-Allow-Headers' ...: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range': ์‘๋‹ต ์‹œ ๋…ธ์ถœํ•  ํ—ค๋”๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • add_header 'Access-Control-Max-Age' 86400: ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์˜ ์บ์‹œ ์œ ํšจ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • proxy_pass http://your_backend_server: ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค.

4. NGINX ์„ค์ • ์ ์šฉ

NGINX ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ ํ›„์—๋Š” NGINX๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์„ค์ •์„ ๋‹ค์‹œ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

sudo nginx -t # ์„ค์ • ํŒŒ์ผ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ
sudo systemctl restart nginx # NGINX ์žฌ์‹œ์ž‘

๋˜๋Š”

sudo nginx -s reload # ์„ค์ • ๋‹ค์‹œ ๋กœ๋“œ

๊ฒฐ๋ก 

์ด ๊ธ€์—์„œ๋Š” Ubuntu ํ™˜๊ฒฝ์—์„œ NGINX๋ฅผ ์„ค์น˜ํ•˜๊ณ  CORS ์„ค์ •์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.
CORS ์„ค์ •์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์„ค์ •์„ ์กฐ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
NGINX์˜ ์œ ์—ฐํ•œ ์„ค์ •์„ ํ™œ์šฉํ•˜์—ฌ ๋ณด์•ˆ๊ณผ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•ด๋ณด์„ธ์š”.


์˜ค๋Š˜ ์•Œ์•„๋ณผ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๊นŒ์ง€!
๋‹ค์Œ์— ๋” ์ข‹์€ ๊ธ€๋กœ ์ฐพ์•„๋ต™์ฃ !