216.73.216.168 TODAY : 4,269

PHP ์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ๊ณ ๊ธ‰

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 5์ฃผ์ฐจ: RESTful API ๋ณด์•ˆ ๋ฐ ์ธ์ฆ - 02 CORS (Cross-Origin Resource Sharing) ์„ค์ •

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 5์ฃผ์ฐจ: RESTful API ๋ณด์•ˆ ๋ฐ ์ธ์ฆ - 02 CORS (Cross-Origin Resource Sharing) ์„ค์ •
ํ‰์  10.0 ๋ผ์ด์„ผ์Šค free
์‚ฌ์šฉ์žํ‰์  10.0 ์šด์˜์ฒด์ œ
๋‹ค์šด๋กœ๋“œ 1 ํŒŒ์ผํฌ๊ธฐ 0
์ œ์ž‘์‚ฌ LUZENSOFT ๋“ฑ๋ก์ผ 2025-09-14 15:54:49
์กฐํšŒ์ˆ˜ 1
- ์„ค๋ช…

CORS๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

uploadImage

#CORS (#CrossOriginResourceSharing)๋Š” ์›น ํŽ˜์ด์ง€์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค๋ฅธ #๋„๋ฉ”์ธ ์—์„œ ์š”์ฒญ๋  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉด์„œ CORS ์„ค์ •์€ ํ•„์ˆ˜์ ์ธ ์š”์†Œ๊ฐ€ ๋˜์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, frontend.com์—์„œ api.backend.com์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์ด๋ฅผ ์ฐจ๋‹จํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณด์•ˆ ์ •์ฑ…์„ #๋™์ผ์ถœ์ฒ˜์ •์ฑ… (#SameOriginPolicy)์ด๋ผ๊ณ  ํ•œ๋‹ค. CORS๋Š” ์ด ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์„ ์™„ํ™”ํ•˜์—ฌ, ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ž์›์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.



๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ… (Same-Origin Policy)


๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์€ ์›น ๋ณด์•ˆ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ด๋Š” ํ•œ ์ถœ์ฒ˜์—์„œ ๋กœ๋“œ๋œ ๋ฌธ์„œ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•œ๋‹ค. ์ถœ์ฒ˜๋Š” #ํ”„๋กœํ† ์ฝœ (http, https), #ํ˜ธ์ŠคํŠธ (www.example.com), #ํฌํŠธ (80, 443)์˜ ์„ธ ๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผ ๋™์ผํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค. ์ด ์ •์ฑ…์ด ์—†์œผ๋ฉด ์•…์˜์ ์ธ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์—ด๋žŒํ•˜๋Š” ๋“ฑ์˜ ํ–‰์œ„๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.



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


CORS๋Š” HTTP ํ—ค๋”๋ฅผ ํ†ตํ•ด ๋™์ž‘ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๊ฐ€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Origin๊ณผ ๊ฐ™์€ CORS ๊ด€๋ จ ํ—ค๋”๋ฅผ ํฌํ•จ์‹œ์ผœ์„œ ์‘๋‹ตํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ํ—ค๋”๋ฅผ ํ™•์ธํ•˜์—ฌ ์š”์ฒญ์„ ํ—ˆ์šฉํ• ์ง€ ์ฐจ๋‹จํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.



1. ๋‹จ์ˆœ ์š”์ฒญ (Simple Requests)


GET, HEAD, POST์™€ ๊ฐ™์€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์ฒญ์€ "๋‹จ์ˆœ ์š”์ฒญ"์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ๋‹จ์ˆœ ์š”์ฒญ์€ #ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ (#Preflight) ์š”์ฒญ ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์„œ๋ฒ„์˜ ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Origin์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‘๋‹ต์„ ํ—ˆ์šฉํ•œ๋‹ค.



2. ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ (Preflight Requests)


๋‹จ์ˆœ ์š”์ฒญ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ (์˜ˆ: PUT, DELETE ๋ฉ”์„œ๋“œ, ์ปค์Šคํ…€ ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ ์š”์ฒญ ๋“ฑ)์€ ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— #ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ์š”์ฒญ ์„ ๋จผ์ € ๋ณด๋‚ธ๋‹ค. ์ด ์š”์ฒญ์€ OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—๊ฒŒ ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฏธ๋ฆฌ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์„œ๋ฒ„๋Š” ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ, ํ—ค๋” ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ CORS ํ—ค๋”๋ฅผ ๋ณด๋‚ธ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ํ—ˆ์šฉ๋œ ๊ฒฝ์šฐ์—๋งŒ ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.



PHP์—์„œ CORS ์„ค์ •ํ•˜๊ธฐ

uploadImage

PHP์—์„œ CORS๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ #HTTPํ—ค๋” ๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” PHP ์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋“  ์ถœ์ฒ˜์— ๋Œ€ํ•œ CORS๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

PHP

<?php
// ๋ชจ๋“  ์ถœ์ฒ˜์— ๋Œ€ํ•ด ์ ‘๊ทผ์„ ํ—ˆ์šฉ
header("Access-Control-Allow-Origin: *");
 
// ํ—ˆ์šฉํ•  HTTP ๋ฉ”์„œ๋“œ ์„ค์ •
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
 
// ํ—ˆ์šฉํ•  HTTP ํ—ค๋” ์„ค์ •
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
 
// Preflight ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต (OPTIONS ๋ฉ”์„œ๋“œ)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}
?>

  • Access-Control-Allow-Origin: *๋Š” ๋ชจ๋“  ๋„๋ฉ”์ธ์—์„œ์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๋ณด์•ˆ์„ ์œ„ํ•ด ํŠน์ • ๋„๋ฉ”์ธ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์˜ˆ์‹œ: Access-Control-Allow-Origin: https://www.yourdomain.com

  • Access-Control-Allow-Methods๋Š” ํ—ˆ์šฉํ•  HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

  • Access-Control-Allow-Headers๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”๋ฅผ ์ •์˜ํ•œ๋‹ค. ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Authorization ํ—ค๋”๋ฅผ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.



์š”์•ฝ

uploadImage

#CORS ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์˜ #๋ณด์•ˆ ์ •์ฑ…์ธ ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์„ ์šฐํšŒํ•˜์—ฌ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. #PHP ์—์„œ๋Š” header() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CORS ๊ด€๋ จ HTTP ํ—ค๋”๋ฅผ ์„ค์ •ํ•จ์œผ๋กœ์จ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ CORS ์„ค์ •์€ #API๋ณด์•ˆ ๊ณผ ์›น ์„œ๋น„์Šค์˜ ์›ํ™œํ•œ ๋™์ž‘์„ ์œ„ํ•ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.


CORS CrossOriginResourceSharing ๋„๋ฉ”์ธ ๋™์ผ์ถœ์ฒ˜์ •์ฑ… SameOriginPolicy ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ ํฌํŠธ ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ Preflight ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ์š”์ฒญ HTTPํ—ค๋” ๋ณด์•ˆ API๋ณด์•ˆ PHP




๋งˆ์ผ€ํŒ…VPN, ๋งˆ์ผ€ํŒ…IP, ๊ฒŒ์ž„IP, ํด๋ฆฐIP, KTํ†ต์‹ ์‚ฌIP, 1์ดˆ IP๋ณ€๊ฒฝ

https://xn--299ao67b9qbmsf04c.net/