2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

웹서버에서 CORS 설정을 하는 방법은?

_____
Q1: CORS란 무엇인가요?
A1: CORS(Cross-Origin Resource Sharing)는 서로 다른 도메인 간에 웹 자원을 안전하게 요청할 수 있도록 브라우저가 지원하는 보안 정책입니다. 기본적으로 웹브라우저는 동일 출처 정책을 적용해 다른 출처(도메인, 프로토콜, 포트)의 요청을 제한하는데, CORS 설정을 통해 이 제한을 완화할 수 있습니다.

Q2: 왜 웹서버에서 CORS 설정이 필요한가요?
A2: 클라이언트(웹브라우저)에서 API 서버가 다른 도메인에 있을 경우, 브라우저는 보안을 위해 요청을 차단합니다. 이 때 서버에서 CORS 헤더를 설정하여 특정 출처에서의 요청을 허용하면, 정상적으로 리소스를 공유할 수 있습니다.

Q3: CORS를 웹서버에서 설정하는 기본 원리는 무엇인가요?
A3: 서버는 응답 헤더에 `Access-Control-Allow-Origin`을 포함하여 허용할 출처(origin)를 지정합니다. 이외에도 HTTP 메서드, 헤더 등 다양한 CORS 관련 헤더를 추가해 클라이언트 요청을 허용 또는 제한할 수 있습니다.

---

아파치(Apache) 웹서버에서 CORS 설정 방법

Q4: Apache에서 CORS를 어떻게 설정하나요?
A4: Apache의 `.htaccess` 파일 또는 서버 설정 파일(httpd.conf, apache2.conf 등)에 다음 예시처럼 설정합니다.

```apache

Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"

```

- 전체 도메인 허용하려면 `"*"`로 설정 가능하나, 보안상 주의 필요
- `mod_headers` 모듈이 활성화 되어 있어야 함 (`a2enmod headers`)

---

Nginx 웹서버에서 CORS 설정 방법

Q5: Nginx에서 CORS를 어떻게 설정하나요?
A5: Nginx 설정 파일(예: `/etc/nginx/sites-available/default`)의 서버 블록 또는 location 블록에 다음을 추가합니다.

```nginx
add_header 'Access-Control-Allow-Origin' 'https://example.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;

OPTIONS 메서드 처리 예시
if ($request_method = OPTIONS ) {
add_header 'Access-Control-Allow-Origin' 'https://example.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
return 204;
}
```

- `always` 옵션은 응답 코드 상관없이 헤더를 추가
- 필요시 OPTIONS 요청에 대한 응답을 처리하여 preflight 요청도 허용

---

Express.js(노드 서버)에서 CORS 설정 방법

Q6: Express.js 서버에서 CORS 설정은 어떻게 하나요?
A6: `cors` 미들웨어를 설치하고 아래와 같이 사용합니다.

```bash
npm install cors
```

```javascript
const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors({
origin: 'https://example.com',
methods: ['GET', 'POST', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
```

---

기타 CORS 설정 관련 FAQ

Q7: `Access-Control-Allow-Origin`에 `"*"`를 써도 되나요?
A7: 가능하지만 인증이 필요한 요청(쿠키, Authorization 헤더 등)에선 사용할 수 없습니다. 보안상 허용 출처를 명확히 지정하는 것이 좋습니다.

Q8: 프리플라이트(preflight) 요청은 무엇이고 어떻게 처리하나요?
A8: 브라우저가 실제 요청 전 OPTIONS 메서드로 서버에 허용 여부를 묻는 요청입니다. 서버는 OPTIONS 요청에 대해 200 또는 204 상태와 함께 적절한 CORS 헤더를 보내야 합니다.

Q9: 여러 출처를 허용할 수 있나요?
A9: `Access-Control-Allow-Origin`는 단일 값만 허용하므로, 서버 코드에서 요청 Origin 헤더를 읽어 허용 목록과 비교 후 동적으로 헤더 값으로 설정하는 방식으로 처리해야 합니다.

---

요약:
웹서버에서 CORS 설정은 기본적으로 응답 헤더에 `Access-Control-Allow-Origin`을 포함시켜 허용 출처를 명시하는 것입니다. Apache, Nginx, Express 등 각 서버 환경에 맞게 헤더를 설정하고, OPTIONS 메서드에 대한 처리도 함께 해야 모든 클라이언트 요청이 정상 처리됩니다.
웹서버에서 CORS(Cross-Origin Resource Sharing)를 설정하는 방법은 사용하는 웹서버 종류(Apache, Nginx, Express.js 등)에 따라 조금씩 다르지만, 기본 원리는 동일합니다.

CORS는 한 도메인에서 실행 중인 웹 애플리케이션이 다른 도메인에 있는 리소스에 접근할 때 발생하는 보안 정책 문제를 해결하기 위해 브라우저가 서버와 통신할 때 HTTP 헤더를 사용하는 방식입니다.

즉, 서버가 클라이언트의 다른 도메인 요청을 허용할지 명시적으로 지정해 주는 것입니다.

아래는 주요 웹서버별 CORS 설정 방법과 작동 원리에 대한 자세한 설명입니다.

1. CORS의 기본 원리와 필요 헤더 - Origin 헤더 : 브라우저가 요청 시 자동으로 보내는 헤더로 호출하는 출처(도메인, 포트, 프로토콜)를 서버에 알려줌. - Access-Control-Allow-Origin : 서버가 응답할 때 반드시 포함해야 하며, 허용할 클라이언트 도메인을 명시함. `*`는 모든 도메인 허용. - Access-Control-Allow-Methods : 어떤 HTTP 메서드(GET, POST, PUT 등)를 허용할지 서버가 명시. - Access-Control-Allow-Headers : 클라이언트가 요청 시 사용하는 커스텀 헤더를 허용할지 명시. - Access-Control-Allow-Credentials : 쿠키, 인증정보 등을 포함한 요청 허용 여부. - Preflight 요청 처리(OPTIONS 메서드) : 복잡한 요청 전에 브라우저가 보내는 사전 요청으로, 서버가 이에 대한 허용 여부를 명확히 해 주어야 함. 서버가 적절한 `Access-Control-*` 헤더를 응답에 포함시키면, 브라우저는 해당 요청을 허용하고, 그렇지 않으면 보안 정책에 의해 차단합니다.

---

2. Apache 웹서버에서 CORS 설정 Apache에서는 `.htaccess` 파일이나 서버 설정 파일(httpd.conf, apache2.conf 등)을 통해 CORS를 설정할 수 있습니다.

- 기본 설정 예시 (모든 도메인에 대해 모든 메서드 허용) ```apache Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" Header set Access-Control-Allow-Headers "Content-Type, Authorization" ``` 설정하는 위치에 따라 `.htaccess`에 넣거나 가상호스트 설정에 넣으면 됩니다.

단, `mod_headers` 모듈이 활성화되어 있어야 합니다(`a2enmod headers` 명령으로 활성화 가능). - Preflight OPTIONS 요청 대응 Apache는 별도의 핸들링이 필요할 수 있으나 보통 위 설정으로 OPTIONS 요청에 대해 헤더가 삽입됨. 더 복잡한 경우, `` 블록에서 처리하거나 리버스 프록시 설정과 결합할 수 있습니다.

---

3. Nginx 웹서버에서 CORS 설정 Nginx는 location 블록 또는 server 블록에서 `add_header` 지시어로 헤더를 추가합니다.

- 기본 설정 예시 ```nginx server { ... location / { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always; OPTIONS 메서드 처리 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } ... } } ``` - `always` 옵션은 오류 응답에서도 헤더가 포함되도록 보장. - OPTIONS 요청을 204(성공, 내용 없음)로 응답해 브라우저 프리플라이트를 처리. ---

4. Node.js Express 서버에서 CORS 설정 Express는 별도의 미들웨어를 사용하는 방법이 가장 편리합니다.

대표적으로 `cors`라는 npm 패키지를 사용합니다.

- 설치 ```bash npm install cors ``` - 사용법 ```javascript const express = require('express'); const cors = require('cors'); const app = express(); // 모든 도메인 허용 app.use(cors()); // 특정 도메인만 허용 (옵션 객체 사용) app.use(cors({ origin: 'https://example.com', methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true })); app.get('/api/data', (req, res) => { res.json({ message: 'CORS Enabled!' }); }); app.listen(3000); ``` `cors()` 미들웨어가 자동으로 적절한 헤더를 삽입하며, OPTIONS 프리플라이트 요청도 자동 처리합니다.

---

5. 기타 주의사항 - `Access-Control-Allow-Origin`을 `*`로 설정하면 인증정보(쿠키, HTTP 인증 등)를 포함한 요청은 허용되지 않습니다.

인증정보와 함께 요청하려면 구체적인 도메인을 지정하고 `Access-Control-Allow-Credentials: true` 헤더를 반드시 설정해야 합니다.

- `Access-Control-Allow-Credentials`를 `true`로 설정하면 `Access-Control-Allow-Origin`은 와일드카드(`*`)를 사용할 수 없습니다.

반드시 특정 출처(origin)만 지정해야 합니다.

- 보안상, 필요한 출처만 정확히 명시하는 것이 좋습니다.

- 프록시 서버나 API 게이트웨이 뒤에서 동작하는 경우, CORS 설정이 여러 곳에 중복되어 발생하지 않도록 주의해야 합니다.

--- 서버에서 CORS 설정은 클라이언트의 출처별 요청을 허용하기 위해 특정 HTTP 응답 헤더들을 삽입하는 작업입니다.

Apache,Nginx는 HTTP 헤더를 직접 추가하는 설정을 하고, Node.js 기반 서버는 미들웨어 사용이 일반적입니다.

제대로 설정하면 브라우저 보안 정책 때문에 차단되던 요청이 허용되어, 크로스 도메인 통신이 원활해집니다.

작성자: 이예진 [비회원] | 작성일자: 1년 전 2025-05-17 10:51:37
조회수: 181 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.