일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- router
- git사용자등록
- 구글바드
- 중첩라우팅
- 조건판단문
- URLSearchParams
- sql연결
- PostView
- GA4
- wp_post
- Thymeleaf
- 플러그인
- mysql-select
- firebase
- 리액트오류
- ChatGPT
- 리액트오류해결
- path variable
- 데이터베이스
- Polylang
- SEO
- White HAT
- 워드프레스
- useLocation
- 구글
- useNavigate
- 구글애널리틱스
- 구글알고리즘
- web-vitals
- useEffect
- Today
- Total
개발천재
CORS(Cross-Origin Resource Sharing) 본문
CORS는 웹 브라우저에서 도메인이 다른 서버끼리 서로 요청을 주고 받을 수 있게끔 해주는 것
CORS 이해하기
CORS(Cross-Origin Resource Sharing)는 웹 브라우저에서 다른 출처의 리소스를 요청할 수 있도록 허용하는 것을 말한다. 웹 애플리케이션은 보안을 위해 기본적으로 동일 출처 정책(Same-Origin Policy)을 따르는데, 이 정책에 따라 한 웹 페이지가 다른 출처의 리소스에 접근하려고 하면 제한이 발생한다. CORS는 이 제한을 허용할 수 있도록 한다.
example.com 이라는 집이 있다고 가정해보자. example.com이라는 집은 그 집에 사는 사람만 들어갈 수 있다. 다른 사람은 허락 없이 들어올 수 없다. 그런데 만약에 example.com에 살고 있는 사람이 another.com이라는 다른 집에 있는 물건을 가져오려고 한다면 가져올 수 있을까? 가져올 수 없다. 그 집에 사는 사람이 아니면 그 집에 들어가서 물건을 가져올 수 없다. 이것을 동일 출처 정책(Same-Origin Policy)이라고 한다.
하지만 CORS가 있다면 다른집에서 물건을 가져올 수 있다.
CORS는 '다른 집에서 물건을 가져오는 것을 허락하는 규칙'이다. 예를 들어, example.com이 another.com에 가서 물건을 가져오고 싶다면, another.com이 허락을 해줘야 한다. another.com에서 "이 집에서 오는 사람은 물건을 가져갈 수 있어요"라고 명시적으로 말해준다면 그 집에 들어가서 물건을 가져올 수 있게 되는 것이다.
CORS의 동작 원리
CORS는 브라우저가 다른 출처의 리소스를 요청할 때 이를 허용하는 서버 측의 설정을 제공한다. 서버는 응답 헤더에 적절한 CORS 정책을 포함하여 브라우저가 요청을 허용하게 한다. CORS 요청은 크게 두 가지 종류로 나뉘는데 단순요청과 사전요청으로 구분할 수 있다.
단순 요청(Simple Request)
GET, POST 요청 등 일부 안전한 HTTP 메서드에 대해서는 별도의 preflight 요청 없이 바로 CORS 헤더를 포함한 응답을 받는다.
사전 요청(Preflight Request)
PUT, DELETE, PATCH 등의 비표준 HTTP 메서드를 사용할 때 또는 요청에 특정 헤더가 포함되면 브라우저는 사전 요청을 보내 서버가 이 요청을 허용하는지 확인한다.
동일 출처 정책 (Same-Origin Policy)
동일 출처 정책은 보안상의 이유로 브라우저가 한 도메인에서 로드된 웹 페이지가 다른 도메인에 있는 리소스를 요청하는 것을 제한하는 메커니즘이다. 예를 들어, https://example.com에서 호스팅되는 웹 페이지는 기본적으로 https://anotherdomain.com에서 리소스를 가져올 수 없다.
이 제한은 크로스 사이트 스크립팅(XSS), 크로스 사이트 요청 위조(CSRF) 등 다양한 보안 문제를 방지한다.
CORS 관련 HTTP 헤더
서버는 CORS 요청을 처리할 때 다음과 같은 HTTP 헤더를 응답에 포함시킨다.
Access-Control-Allow-Origin
어떤 도메인에서 요청을 허용할지 정의한다.
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Origin: *
example.com에서 요청을 허용한다.
* 값을 주면 모든 도메인에서의 요청을 허용한다. 이는 매우 개방적인 설정으로, 보통 공개된 API나 누구나 접근할 수 있어야 하는 리소스에 사용된다.
Access-Control-Allow-Methods
어떤 HTTP 메서드를 허용할지 정의한다.
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
GET, POST, PUT, DELETE 메서드만 허용한다.
Access-Control-Allow-Headers
요청 헤더에 어떤 헤더를 사용할 수 있을지 정의한다.
Access-Control-Allow-Headers: Content-Type, Authorization
요청 헤더에 Content-Type과 Authorization을 포함시킬 수 있다.
Access-Control-Allow-Credentials
요청에 자격 증명(쿠키 등)을 포함시킬지 여부를 정의한다.
Access-Control-Allow-Credentials: true
자격 증명이 포함된 요청을 허용한다.
Access-Control-Expose-Headers
응답 헤더 중에서 클라이언트가 접근할 수 있는 헤더를 정의한다.
Access-Control-Expose-Headers: X-Custom-Header
X-Custom-Header를 클라이언트에서 읽을 수 있게 한다.
Cross-Origin-Opener-Policy policy 오류
Cross-Origin-Opener-Policy policy would block the window.close call.
Cross-Origin-Opener-Policy policy would block the window.close call. 오류는 브라우저 보안 정책 때문에 발생하는 문제이다.
Cross-Origin-Opener-Policy(COOP) 정책에 의해 window.close() 호출이 차단된다는 오류는, 주로 브라우저에서 보안 설정이 활성화된 상태에서 발생한다. COOP는 서로 다른 출처(origin)의 문서나 스크립트가 상호작용하는 것을 제한하여 보안을 강화하는 기능이다.
주된 원인은 OAuth 로그인 후 window.close()를 실행할 때 발생하는 경우가 많다. Firebase 인증을 사용할 때 팝업 방식 (signInWithPopup) 을 사용하면 브라우저의 COOP(Cross-Origin-Opener-Policy) 정책이 window.close()를 차단할 수 있다.
firebase 사용시 오류 해결 방법
firebase와 함께 리액트 프로젝트에서 Cross-Origin-Opener-Policy 관련 오류가 발생한 경우, 이는 Firebase와의 통신에서 발생하는 보안 정책 문제일 가능성이 크다. firebase는 외부 서비스와의 통신을 허용하지만, 브라우저에서 특정 보안 정책을 요구할 수 있다.
Firebase Functions에서 CORS 설정하기
firebase에서 CORS 오류를 해결하려면, firebase functions를 사용할 때, firebase functions의 CORS 설정을 수정해야 한다. 예를 들어, Firebase Functions로 API를 호출하는 경우 CORS 헤더를 설정할 수 있다.
const functions = require("firebase-functions");
const cors = require("cors");
const express = require("express");
const app = express();
app.use(cors({ origin: true })); // 모든 도메인에서 접근 허용
app.get("/some-api", (req, res) => {
res.json({ message: "Hello from Firebase Functions!" });
});
exports.api = functions.https.onRequest(app);
Firebase에서 COOP(교차 출처 개방 정책) 설정
firebase Hosting에서는 기본적으로 COOP(교차 출처 개방 정책) 헤더가 자동으로 설정되며, 이로 인해 다른 출처에서 window.close()를 호출할 때 문제가 발생하기도 한다. 이를 해결하기 위해 Firebase Hosting의 firebase.json 파일을 수정한다.
이 설정은 Firebase Hosting에서 제공하는 파일에 대해 Cross-Origin-Opener-Policy 헤더를 추가한다. 이렇게 하면 동일 출처 정책을 강화하고, 다른 출처에서 자식 창을 닫을 수 없도록 설정할 수 있다.
{
"hosting": {
"headers": [
{
"source": "/**",
"headers": [
{
"key": "Cross-Origin-Opener-Policy",
"value": "same-origin"
}
]
}
]
}
}
'개발 준비 > 기타' 카테고리의 다른 글
Query string과 Path Variable (0) | 2025.02.06 |
---|---|
쿠키(cookies)와 세션(session) (0) | 2025.02.03 |