๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Frontend/TroubleShooting

[TroubleShooting] curl๋กœ๋Š” ์žฌํ˜„๋˜์ง€ ์•Š๋Š” CORS ์—๋Ÿฌ, ์›์ธ์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์˜€๋‹ค (with PNA)

by YWTechIT 2026. 8. 4.
728x90

๐Ÿ“ curl๋กœ๋Š” ์žฌํ˜„๋˜์ง€ ์•Š๋Š” CORS ์—๋Ÿฌ, ์›์ธ์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์˜€๋‹ค (with PNA)

๐Ÿ“ TL;DR

  • T&A dev ํ™˜๊ฒฝ์—์„œ ํŠน์ • API ํ˜ธ์ถœ ์‹œ CORS ์—๋Ÿฌ๋กœ ์‹คํŒจํ–ˆ๋‹ค.
  • ์›์ธ์€ ์ผ๋ฐ˜์ ์ธ CORS ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ Chrome์˜ Private Network Access(PNA) ์ •์ฑ…์ด์—ˆ๋‹ค.
  • dev ํ™˜๊ฒฝ์˜ API ๋„๋ฉ”์ธ์€ ๋‚ด๋ถ€ IP๋กœ resolve ๋˜๋Š” ๋ฐ˜๋ฉด, ํ˜ธ์ถœํ•˜๋Š” ํŽ˜์ด์ง€๋Š” public ์‚ฌ์ดํŠธ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ "์ด ์‚ฌ์ดํŠธ๊ฐ€ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ๊ธฐ๊ธฐ์— ์ ‘๊ทผํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค"๋ผ๋ฉฐ ๊ถŒํ•œ ํ™•์ธ์„ ์š”๊ตฌํ–ˆ๊ณ , ๊ทธ ๊ถŒํ•œ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ์š”์ฒญ์ด ๋ง‰ํ˜”๋‹ค.
  • ์šด์˜ ํ™˜๊ฒฝ์€ API ๋„๋ฉ”์ธ์ด public IP(CDN)๋กœ ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค — ๋‚ด๋ถ€๋ง์„ ์ง์ ‘ ๋…ธ์ถœํ•œ dev ํ™˜๊ฒฝ ๊ณ ์œ ์˜ ์ด์Šˆ์˜€๋‹ค.

์ฆ์ƒ

์นดํ…Œ๊ณ ๋ฆฌ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ fetch ํ•œ๋‹ค.

GET https://api.dev.example.in/category-overview

 

์ด๋ฏธ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ž˜ ๋™์ž‘ํ•˜๋˜ ๋‹ค๋ฅธ dev ํ˜ธ์ŠคํŠธ(dev-example.com)์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ, ์ƒˆ๋กœ ๋ถ™์ธ dev-tour.example.com์—์„œ๋งŒ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— ๋‹ค์Œ ์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค.

Access to fetch at 'https://api.dev.example.in/category-overview'
from origin 'https://dev-tour.example.com' has been blocked by CORS policy:
Permission was denied for this request to access the `local` address space.

 

Network ํƒญ์—์„œ๋Š” ์‹ค์ œ ์š”์ฒญ์ด ๋‚˜๊ฐ„ ํ”์  ์—†์ด Response headers (0), (provisional headers are shown) ์ƒํƒœ๋กœ ํ‘œ์‹œ๋๋‹ค. ์ด๋ฅผ ํ†ตํ•ด preflight ๋‹จ๊ณ„์—์„œ ๋ง‰ํžŒ ์ƒํƒœ์ž„์„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฒ˜์Œ ์˜์‹ฌํ•œ ๊ฒƒ๋“ค

  1. host ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฏธ๋“ฑ๋ก?
    curl๋กœ ๊ฐ๊ฐ Origin/ํ—ค๋”๋ฅผ ํฌํ•จํ•˜์—ฌ ์š”์ฒญํ•˜๋‹ˆ ์„œ๋ฒ„๋Š” 200์„ ๋ฐ˜ํ™˜ํ–ˆ๊ณ , Access-Control-Allow-Origin์— ์š”์ฒญํ•œ origin์ด ์‘๋‹ตํ–ˆ๋‹ค. ์ด๋กœ์จ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ํŒ๋‹จํ–ˆ๋‹ค.
  2. ์ปค์Šคํ…€ ํ—ค๋” ๋ฌธ์ œ?
    Access-Control-Request-Headers์— ์ปค์Šคํ…€ ํ—ค๋” 2๊ฐœ๋ฅผ ๋ช…์‹œํ•ด์„œ preflight๋ฅผ ๋ณด๋‚ด๋ด๋„ ์„œ๋ฒ„๋Š” ์ •์ƒ์ ์œผ๋กœ ํ—ˆ์šฉ ์‘๋‹ต์„ ์คฌ๋‹ค.
  3. ์„œ๋ฒ„ ์„ค์ • ์ฐจ์ด?
    ๋‘ origin์œผ๋กœ ์™„์ „ํžˆ ๋™์ผํ•œ preflight๋ฅผ ๋ณด๋‚ด ๋น„๊ตํ–ˆ์ง€๋งŒ ์„œ๋ฒ„ ์‘๋‹ต์€ ๋‹ค๋ฅด์ง€ ์•Š์•˜๋‹ค. ์„œ๋ฒ„ ์ชฝ ์„ค์ • ์ฐจ์ด๋Š” ์•„๋‹ˆ์—ˆ๋‹ค.

curl๋กœ๋Š” ์•„๋ฌด๋ฆฌ ์žฌํ˜„ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ด๊ฑด ์• ์ดˆ์— ์„œ๋ฒ„ ์‘๋‹ต์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์˜ ์ •์ฑ…์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. curl์€ CORS๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š” ๋„๊ตฌ๋ผ ์ด ๊ณ„์ธต์˜ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์›์ธ — Private Network Access (PNA)

๋ช‡ ๋ฒˆ์˜ ์‚ฝ์งˆ ๋์—, ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ž์„ธํžˆ ๋‹ค์‹œ ์ฝ์–ด๋ดค๋‹ค.

> Permission was denied for this request to access the 'local' address space.

 

์ด๊ฑด ์ผ๋ฐ˜์ ์ธ CORS ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค. Chrome์€ ๋ช‡ ๋…„ ์ „๋ถ€ํ„ฐ public ์›น์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์„ค/๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ณด์•ˆ ๊ณ„์ธต์„ ์ ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ Private Network Access(PNA)๋ผ ๋ถ€๋ฅธ๋‹ค.

 

์‰ฝ๊ฒŒ ๋งํ•ด, ๊ณต๊ฐœ ์ธํ„ฐ๋„ท์— ์žˆ๋Š” ์•„๋ฌด ์›น์‚ฌ์ดํŠธ๋‚˜ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๊ทธ ์‚ฌ์ดํŠธ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ณต์œ ๊ธฐ ๊ด€๋ฆฌ ํŽ˜์ด์ง€(192.168.x.x)๋‚˜ ์‚ฌ๋‚ด ์„œ๋ฒ„(10.x.x.x)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ„ํ—˜ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋Ÿฐ ์š”์ฒญ์— ๋ณ„๋„์˜ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ์š”๊ตฌํ•œ๋‹ค.

 

์‹ค์ œ๋กœ ์š”์ฒญํ•˜๋Š” API ํ˜ธ์ŠคํŠธ์˜ IP๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

$ dig +short api.dev.example.in
...dev.example.in.
10.0.xx.xx
10.0.xx.xx
...

 

์ฆ‰, ์‚ฌ์„ค IP(10.0.x.x)๋กœ resolve๋œ๋‹ค. ๋ฐ˜๋ฉด dev-tour.example.com์€ CDN์˜ public IP์—์„œ ์„œ๋น™๋จ์„ ํ™•์ธํ–ˆ๋‹ค.

$ dig +short dev-tour.example.com
cloudflare...
172.xx.x.xxx
162.xxx.xxx.xxx

๋ธŒ๋ผ์šฐ์ €๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„์„ 3๋‹จ๊ณ„๋กœ ๋‚˜๋ˆˆ๋‹ค

PNA๊ฐ€ ๋ณด๋Š” ๊ฑด "์‚ฌ์„ค IP๋ƒ ์•„๋‹ˆ๋ƒ"๋ผ๋Š” ์ด๋ถ„๋ฒ•์ด ์•„๋‹ˆ๋‹ค. Chrome์€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ public < private < local 3๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„๊ณ , ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํŽ˜์ด์ง€๋ณด๋‹ค ๋Œ€์ƒ์ด ๋” ํ์‡„์ ์ธ ๋‹จ๊ณ„๋กœ ๊ฐˆ ๋•Œ๋งŒ ์ฒดํฌ๋ฅผ ๊ฑด๋‹ค.

  • public — ์ธํ„ฐ๋„ท ์–ด๋””์„œ๋‚˜ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ (CDN, ๊ณต๊ฐœ ์„œ๋ฒ„ ๋“ฑ)
  • private — ์‚ฌ์„ค IP ๋Œ€์—ญ(10.x.x.x, 172.16~31.x.x, 192.168.x.x)์— ์†ํ•˜๋Š” ์ฃผ์†Œ
  • locallocalhost, 127.0.0.1 ๋“ฑ ๊ทธ๋ณด๋‹ค ๋” ์ข์€ ๋ฒ”์œ„

์ด๋ฒˆ ์ผ€์ด์Šค๋Š”:

  • ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€(dev-tour.example.com) → CDN์˜ public IP → public ๋‹จ๊ณ„
  • ์š”์ฒญ ๋Œ€์ƒ API(api.dev.example.in) → ์‚ฌ๋‚ด ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์„ค IP → private ๋‹จ๊ณ„

public → private๋กœ ๊ฐ€๋Š” ์š”์ฒญ์ด๋ผ ์ •ํ™•ํžˆ ์ฒดํฌ ๋Œ€์ƒ์— ๋“ค์–ด๋งž์•˜๋‹ค. ๋งŒ์•ฝ ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€๋„ ์‚ฌ๋‚ด๋ง IP์—์„œ ์„œ๋น™๋˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด(private → private), ์š”์ฒญ์ž์™€ ๋Œ€์ƒ์˜ ํ์‡„๋„๊ฐ€ ๊ฐ™์œผ๋‹ˆ ์ด ์ฒดํฌ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐœ๋™ํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๊ณ , PNA ์ด์Šˆ๋„ ์—†์—ˆ์„ ๊ฒƒ์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ€ "๋ฌผ์–ด๋ณด๊ณ " ์„œ๋ฒ„๊ฐ€ "๋‹ตํ•ด์•ผ" ํ†ต๊ณผํ•œ๋‹ค

์ด ํŒ๋‹จ์€ preflight ์š”์ฒญ/์‘๋‹ต์˜ ํŠน์ • ํ—ค๋” ํ•œ ์Œ์œผ๋กœ ์˜ค๊ฐ„๋‹ค. ์ด๋ฆ„์ด ๋น„์Šทํ•ด์„œ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด๋ฐ, ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ์„œ๋กœ ๋‹ค๋ฅธ ํ—ค๋”๋‹ค.

1. ๋ธŒ๋ผ์šฐ์ € → ์„œ๋ฒ„ (OPTIONS preflight)
   Access-Control-Request-Private-Network: true

2. ์„œ๋ฒ„ → ๋ธŒ๋ผ์šฐ์ € (preflight ์‘๋‹ต)
   Access-Control-Allow-Private-Network: true

3. ๋ธŒ๋ผ์šฐ์ €: Access-Control-Allow-Private-Network ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ๊ทธ์ œ์„œ์•ผ ์ง„์งœ GET ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค

 

์ด๋ฒˆ ์ด์Šˆ์—์„œ ์‹ค์ œ๋กœ ๋ฒŒ์–ด์ง„ ์ผ์€, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Access-Control-Request-Private-Network ํ—ค๋”๋Š” ์ •์ƒ์ ์œผ๋กœ ๋ณด๋ƒˆ์ง€๋งŒ ์‘๋‹ต์—๋Š” Access-Control-Allow-Private-Network ํ—ค๋”๊ฐ€ ์—†์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ์„œ๋ฒ„์—์„œ ์‘๋‹ต ํ—ค๋”๊ฐ€ ๋‚ด๋ ค์˜ค์ง€์•Š์•˜๊ณ , ์ด๋กœ์ธํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์„ ๋ง‰์€ ๊ฒƒ์œผ๋กœ ๋ณด์˜€๋‹ค.

์™œ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋Š” ๋ฌธ์ œ์—†์ด ๋˜๊ณ  ์žˆ์—ˆ๋‚˜

๊ฐ€์žฅ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„์ด๋‹ค. ๊ฐ™์€ ์ฝ”๋“œ, ๊ฐ™์€ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” dev-example.com์€ ์ž˜ ๋˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฒ˜์Œ์—” "์„œ๋ฒ„๊ฐ€ origin๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰ํ•˜๋‚˜?"๋ผ๋Š” ์ž˜๋ชป๋œ ๊ฐ€์„ค์„ ์„ธ์› ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์‘๋‹ต์„ ์•„๋ฌด๋ฆฌ ๋น„๊ตํ•ด๋„ ์ฐจ์ด๊ฐ€ ์—†์—ˆ๋‹ค.

 

์‹ค์ œ ์›์ธ์€ ๋ธŒ๋ผ์šฐ์ € ์ชฝ์— ์žˆ์—ˆ๋‹ค. Chrome์˜ PNA๋Š” ์‚ฌ์ดํŠธ๋ณ„ ์ตœ์ดˆ ์š”์ฒญ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ํŒ์—…์„ ๋„์šฐ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์Šน์ธํ•˜๋ฉด ๊ทธ ๊ฒฐ์ •์ด ๋ธŒ๋ผ์šฐ์ €์— ๋‚จ๋Š”๋‹ค. dev-example.com์„ ์˜ค๋ž˜ ์จ์˜จ ๊ฐœ๋ฐœ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ์ด๋ฏธ ์ด ๊ถŒํ•œ์ด ํ—ˆ์šฉ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์—ˆ์„ ๋ฟ, ์„œ๋ฒ„๊ฐ€ ๊ทธ origin์„ ํŠน๋ณ„ ์ทจ๊ธ‰ํ•œ ๊ฒŒ ์•„๋‹ˆ์—ˆ๋‹ค.

 

์ด๊ฑธ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Chrome ์„ค์ •์—์„œ ํ•ด๋‹น ์‚ฌ์ดํŠธ์˜ "๋กœ์ปฌ ๋„คํŠธ์›Œํฌ" ๊ถŒํ•œ์„ ํ—ˆ์šฉ์œผ๋กœ ๋ฐ”๊พผ ๋’ค ์žฌ์‹œ๋„ํ–ˆ๋”๋‹ˆ dev-tour.example.com์—์„œ๋„ ์ •์ƒ์ ์œผ๋กœ API๊ฐ€ ํ˜ธ์ถœ๋๋‹ค. ์ด๊ฑธ๋กœ ์›์ธ์ด PNA์ธ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ๋‹ค.

์™œ ์šด์˜(prod) ํ™˜๊ฒฝ์€ ์ด ๋ฌธ์ œ๊ฐ€ ์—†์„๊นŒ?

์šด์˜ ํ™˜๊ฒฝ์˜ API ๋„๋ฉ”์ธ์„ ํ™•์ธํ•ด๋ณด๋ฉด dev์™€ ๋‹ค๋ฅด๋‹ค.

$ dig +short api.example.com
cdn-edge.example.com.
203.0.xxx.xx
203.0.xxx.xx

์šด์˜ API๋Š” CDN์„ ํ†ตํ•ด public IP๋กœ ๋…ธ์ถœ๋œ๋‹ค. ์ฆ‰ ์šด์˜ ํŠธ๋ž˜ํ”ฝ์€ "public → public" ์š”์ฒญ์ด๋ผ PNA ์ฒดํฌ ์กฐ๊ฑด ์ž์ฒด๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. dev ํ™˜๊ฒฝ์—์„œ๋งŒ BFF๊ฐ€ ๋‚ด๋ถ€๋ง IP๋กœ ์ง์ ‘ ๋…ธ์ถœ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธด, dev ํ™˜๊ฒฝ ๊ณ ์œ ์˜ ๋ฌธ์ œ์˜€๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉํ–ฅ

ํ™˜๊ฒฝ๋ณ„๋กœ ์š”์ฒญ/๋Œ€์ƒ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ์กฐํ•ฉ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š”ํ•œ ์กฐ์น˜๋„ ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅด๋‹ค.

  • dev (๋‚ด๋ถ€๋ง ํ™˜๊ฒฝ): API๊ฐ€ ์‚ฌ์„ค IP๋กœ ๋…ธ์ถœ๋ผ ์žˆ์–ด public → private ์กฐํ•ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด ํ™˜๊ฒฝ์€ ์‚ฌ๋‚ด ์ธ์›๋งŒ ์ ‘๊ทผํ•˜๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•ด๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

  • ์šด์˜(prod): API๊ฐ€ CDN์„ ํ†ตํ•ด public IP๋กœ ๋…ธ์ถœ๋ผ ์žˆ์–ด public → public ์š”์ฒญ์ด๋‹ค. PNA ์ฒดํฌ ์กฐ๊ฑด ์ž์ฒด๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณ„๋„ ์กฐ์น˜๊ฐ€ ํ•„์š” ์—†๋‹ค.

์ •๋ฆฌ

  • ์ฆ์ƒ: dev ํ™˜๊ฒฝ์˜ ํŠน์ • ์‹ ๊ทœ ํ˜ธ์ŠคํŠธ์—์„œ๋งŒ ๋ฐœ์ƒํ•œ CORS ์—๋Ÿฌ๋กœ API ํ˜ธ์ถœ ์‹คํŒจ
  • ์›์ธ: ๋ธŒ๋ผ์šฐ์ €์˜ Private Network Access(PNA) — public ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์„ค IP๋กœ ๋…ธ์ถœ๋œ dev API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐœ์ƒ
  • ํ—ท๊ฐˆ๋ ธ๋˜ ์ด์œ : ๋ธŒ๋ผ์šฐ์ € ์ •์ฑ…์ด๋ผ ์„œ๋ฒ„ ์ชฝ(curl, ์‘๋‹ต ํ—ค๋” ๋น„๊ต)์œผ๋กœ๋Š” ์žฌํ˜„/ํŒ๋ณ„์ด ์•ˆ ๋๊ณ , ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ "์ž˜ ๋˜๊ณ  ์žˆ์—ˆ๋‹ค"๋Š” ๊ฒƒ๋„ ์„œ๋ฒ„ ์„ค์ •์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋ธŒ๋ผ์šฐ์ €์— ๋‚จ์•„์žˆ๋˜ ๊ณผ๊ฑฐ ๊ถŒํ•œ ์Šน์ธ ์ƒํƒœ์˜€๋‹ค
  • ํ•ด๊ฒฐ: dev/qa๋Š” ๋‚ด๋ถ€๋ง ํ™˜๊ฒฝ์ด๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ—ˆ์šฉ, ์šด์˜ ํ™˜๊ฒฝ์€ API๊ฐ€ public IP๋กœ ๋…ธ์ถœ๋˜์–ด ์žˆ์–ด ์›์ฒœ์ ์œผ๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ๋ณ„๋„ ์กฐ์น˜ ๋ถˆํ•„์š”

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€