![]()
CORS의 이해

CORS는 "교차 출처 리소스 공유"라는 의미를 가지고 있으며, 웹 브라우저가 서로 다른 출처 간의 리소스를 안전하게 공유할 수 있도록 해주는 정책입니다. 웹 브라우저는 보안을 위해 기본적으로 Same-Origin Policy(SOP)를 따르며, 이 정책에 따라 동일 출처의 리소스만을 허용합니다.
동일 출처란 프로토콜, 호스트, 포트가 모두 동일해야 한다는 의미입니다. 예를 들어,http://example.com:80과 http://example.com:3000은 동일한 호스트와 프로토콜을 가지고 있지만, 포트가 다르기 때문에 서로 다른 출처로 간주됩니다.이와 같은 이유로, 브라우저는 서로 다른 출처의 리소스를 요청할 때 기본적으로 이를 차단하게 됩니다. 이러한 보안 정책이 존재하는 이유는 CSRF(Cross-Site Request Forgery)와 XSS(Cross-Site Scripting)와 같은 악성 공격으로부터 사용자를 보호하기 위함입니다.
CORS의 작동 방식
CORS는 서버가 특정 출처에 대해 리소스를 공유하도록 허용할 수 있는 방법을 제공합니다. 이를 위해 서버는 응답 헤더에 Access-Control-Allow-Origin을 포함시켜 특정 출처를 명시해야 합니다.
| CORS 관련 헤더 | 설명 |
|---|---|
| Access-Control-Allow-Origin | 리소스를 접근할 수 있는 허용된 출처를 지정합니다. |
| Access-Control-Allow-Methods | 허용된 HTTP 메서드(GET, POST 등)를 명시합니다. |
| Access-Control-Allow-Headers | 요청 시 사용할 수 있는 헤더를 지정합니다. |
이러한 헤더들은 CORS 요청이 성공적으로 이루어지기 위해 필수적으로 포함되어야 합니다. 만약 서버가 이러한 헤더를 올바르게 설정하지 않으면, 웹 애플리케이션은 외부 리소스를 안전하게 사용할 수 없게 됩니다.
CORS 오류의 발생 원인

CORS 오류는 다양한 상황에서 발생할 수 있습니다. 가장 일반적인 경우는 다음과 같습니다.
- 서버의 CORS 설정이 누락됨: 서버가 CORS 헤더를 설정하지 않았거나 잘못 설정한 경우입니다.
- 허용되지 않은 출처에서 요청함: 서버가 특정 출처만을 허용하도록 설정했지만, 클라이언트에서 다른 출처로 요청할 경우 발생합니다.
- 자격 증명(credential) 요청과 관련된 오류: 쿠키나 HTTP 인증 정보를 포함한 요청을 보낼 때, 서버에서
Access-Control-Allow-Credentials헤더를 올바르게 설정하지 않으면 오류가 발생합니다.
CORS 오류 메시지 예시
CORS 오류가 발생하면 일반적으로 다음과 같은 메시지가 브라우저의 콘솔에 표시됩니다.
Access to XMLHttpRequest at 'https://api.example.com/data' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
이 메시지는 클라이언트의 출처가 서버에서 허용되지 않는 경우 발생합니다. 이러한 오류를 해결하기 위해서는 서버 측에서 적절한 CORS 설정이 필요합니다.
| CORS 오류 메시지 예시 | 설명 |
|---|---|
| Blocked by CORS policy | CORS 정책에 의해 요청이 차단되었다는 메시지입니다. |
| Preflight request doesn't pass | 예비 요청(preflight request)이 통과하지 못했다는 의미입니다. |
CORS 오류 해결 방법

CORS 오류를 해결하기 위해서는 여러 가지 접근 방법이 있습니다. 가장 일반적으로 사용되는 방법은 서버 측에서 CORS 관련 헤더를 올바르게 설정하는 것입니다.
다음은 서버 유형별로 CORS 설정 방법을 정리한 표입니다.| 서버 유형 | CORS 설정 방법 |
|---|---|
| Node.js (Express) | app.use(cors()) 또는 res.header("Access-Control-Allow-Origin", "*") |
| Apache | Header set Access-Control-Allow-Origin "*" |
| Nginx | add_header Access-Control-Allow-Origin *; |
| Spring (Java) | @CrossOrigin(origins = "*") 또는 ResponseEntity로 설정 |
Node.js에서의 CORS 설정 예시
Node.js에서는 cors 미들웨어를 사용하여 CORS를 쉽게 설정할 수 있습니다. 다음은 간단한 코드 예시입니다.
```javascript const express = require('express'); const cors = require('cors'); const app = express();
app.use(cors()); // 모든 출처 허용
app.get('/data', (req, res) => { res.json({ message: 'Hello World' }); });
app.listen(3000, () => { console.log('Server running on port 3000'); }); ```
위의 코드에서 app.use(cors())를 추가함으로써 모든 출처의 요청을 허용하게 됩니다. 특정 출처만 허용하고자 할 경우, cors({ origin: 'http://example.com' })와 같이 설정할 수 있습니다.
Apache 서버에서의 설정 예시
Apache에서는 .htaccess 파일이나 httpd.conf 파일에 다음과 같은 내용을 추가하여 CORS를 설정할 수 있습니다.
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
위의 설정을 통해 모든 출처의 요청을 허용할 수 있습니다. 보안상 이유로 특정 출처만 허용하고 싶다면, * 대신 특정 도메인을 입력하면 됩니다.
CORS 오류 해결 시 주의사항

CORS 설정을 할 때는 몇 가지 주의사항이 있습니다. 특히, Access-Control-Allow-Origin을 *로 설정하게 되면 모든 출처에서 오는 요청을 허용하게 되므로 보안에 취약해질 수 있습니다.
withCredentials: true 옵션을 설정해야 쿠키나 인증 정보를 포함한 요청이 가능합니다.
CORS 설정 시 확인해야 할 사항
| 확인 사항 | 설명 |
|---|---|
| 허용할 출처를 명시했는가? | Access-Control-Allow-Origin 헤더에 허용할 출처를 명시해야 합니다. |
| HTTP 메서드 허용 여부 확인 | Access-Control-Allow-Methods 헤더에 필요한 메서드를 포함해야 합니다. |
| 헤더 정보 포함 여부 확인 | 필요 시 Access-Control-Allow-Headers에 요청할 헤더를 명시해야 합니다. |
결론
CORS 오류는 웹 개발에서 흔히 발생하는 문제로, 이를 해결하기 위해서는 CORS의 원리를 알아보고 서버 설정을 올바르게 구성하는 것이 필요합니다. CORS는 웹 애플리케이션의 보안을 유지하면서도 외부 리소스를 안전하게 사용할 수 있도록 도와주는 기능입니다.
따라서 적절한 설정을 통해 CORS 오류를 원활하게 해결하고, 보다 안전하고 효율적인 웹 애플리케이션을 개발할 수 있을 것입니다.