CORS란
2024. 12. 2. 16:02ㆍexpress
728x90
반응형
1. CORS가 대체 뭐길래?
CORS(Cross-Origin Resource Sharing)는 서로 다른 도메인 간 요청을 허용하거나 차단하는 규칙입니다.
동일 출처 정책(Same-Origin Policy)
브라우저는 기본적으로 보안 때문에 **동일 출처(Same-Origin)**가 아닌 요청을 차단합니다. 여기서 동일 출처란, URL의 스키마(프로토콜), 도메인, 포트 번호가 모두 같아야 한다는 뜻입니다.
예시
- 프론트엔드: http://localhost:3000
- 백엔드(API 서버): http://api.example.com
이 경우, 두 URL의 도메인이 다르기 때문에 브라우저는 보안상 요청을 차단합니다. 하지만 우리는 보통 이런 요청을 허용해야 하죠. 여기서 CORS가 등장합니다!
2. CORS가 필요한 이유
CORS 없이는?
프론트엔드에서 데이터를 요청했더니 이런 오류를 본 적 있으실겁니다.
Access to fetch at 'http://api.example.com' from origin 'http://localhost:3000' has been blocked by CORS policy.
이 메시지는 CORS 정책을 위반했기 때문에 요청이 차단되었다는 뜻입니다.
CORS로 해결
CORS는 서버가 **"내가 허락한 도메인만 데이터를 가져가도 돼!"**라고 알려주는 시스템입니다.
서버가 허락을 설정하면, 브라우저는 요청을 허용하게 됩니다.
3. CORS는 어떻게 작동할까?
CORS의 작동 방식은 다음과 같이 간단합니다:
- 클라이언트(프론트엔드)가 서버에 요청을 보냅니다.
- 브라우저는 이 요청이 다른 도메인이라면, CORS 정책을 확인합니다.
- 서버가 응답합니다.
- "네 요청을 허용합니다" 또는 "허용하지 않습니다."
- 브라우저가 서버의 응답을 확인합니다.
- 허락받았으면 요청을 성공적으로 처리합니다.
CORS 요청의 종류
CORS 요청은 크게 두 가지로 나뉩니다.
1. Simple Request (단순 요청)
- 브라우저가 곧바로 요청을 보냅니다.
- GET, POST, HEAD 메서드만 사용.
- Content-Type이 제한된 값(application/x-www-form-urlencoded, text/plain)이어야 합니다.
2. Preflight Request (사전 요청)
- 브라우저가 요청 전에 OPTIONS 메서드를 사용해 "이 요청을 보내도 되는지" 서버에 확인합니다.
- 요청 메서드가 PUT, DELETE 등 단순하지 않거나, 커스텀 헤더를 사용하는 경우 발생합니다.
4. Express로 CORS 해결하기
간단한 CORS 설정
Node.js의 Express를 사용한다면, cors 미들웨어를 추가해 쉽게 CORS를 설정할 수 있습니다.
import cors from "cors";
app.use(
cors({
origin: "http://localhost:3000", // 허용할 도메인
methods: ["GET", "POST"], // 허용할 메서드
credentials: true, // 쿠키 전송 허용
})
);
CORS 설정 해석
- origin: 요청을 허용할 도메인.
- http://localhost:3000에서만 요청 허용.
- "*"로 설정하면 모든 도메인에서 요청 허용(보안상 위험).
- methods: 허용할 HTTP 메서드(GET, POST, PUT, DELETE 등).
- credentials: 인증 정보(쿠키, 세션 등) 전송 허용 여부.
5. CORS 설정 예시
프론트엔드에서 요청
React 앱에서 데이터를 가져오려면 이렇게 요청할 수 있습니다:
fetch("http://api.example.com/data", {
method: "GET",
credentials: "include", // 쿠키 포함
})
.then((response) => response.json())
.then((data) => console.log(data))
6. CORS를 이해하기 위한 비유
CORS를 도서관의 대출 시스템에 비유해 봅시다:
- 당신(프론트엔드): 도서관(서버)에서 책(데이터)을 빌리고 싶습니다.
- 도서관 규칙(CORS): "이름과 신분증(출처)을 보여주세요!"
- 허가된 방문자만 대출 가능: 도서관이 "당신의 출처는 허가되었으니 책을 빌릴 수 있어요!"라고 말합니다.
- 출처가 허가되지 않음: 도서관이 "죄송합니다, 외부 방문자는 대출할 수 없습니다."라고 응답.
7. CORS에서 주의할 점
- 보안 문제
- CORS를 설정할 때는 허용할 도메인을 명확히 지정해야 합니다.
- "*"로 모든 도메인을 허용하는 설정은 절대 사용하지 마세요 (특히 인증 정보가 필요한 경우).
- HTTPS 환경
- credentials: true를 사용하려면 HTTPS 환경에서 실행해야 합니다.
- 서버에서 secure: true 설정 필요.
'express' 카테고리의 다른 글
fly.io 배포 (0) | 2024.01.12 |
---|---|
express 할일리스트 조회, 생성, 삭제, 수정 (1) | 2024.01.04 |
express (0) | 2024.01.04 |