
PHP ์จ๋ผ์ธ ๊ฐ์
>PHP - ๊ณ ๊ธ
๐ 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๋ ๋ฌด์์ธ๊ฐ?
#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 ์ค์ ํ๊ธฐ
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
ํค๋๋ฅผ ๋ฐ๋์ ์ถ๊ฐํด์ผ ํ๋ค.
์์ฝ
#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/