Cross-origin resource sharing
교차 출처 리소스 공유(Cross-origin resource sharing, CORS), 교차 출처 자원 공유는 웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조이다. 웹페이지는 교차 출처 이미지, 스타일시트, 스크립트, iframe, 동영상을 자유로이 임베드할 수 있다. 특정한 도메인 간(cross-domain) 요청, 특히 Ajax 요청은 동일-출처 보안 정책에 의해 기본적으로 금지된다.
CORS는 교차 출처 요청을 허용하는 것이 안전한지 아닌지를 판별하기 위해 브라우저와 서버가 상호 통신하는 하나의 방법을 정의한다. 순수하게 동일한 출처 요청보다 더 많은 자유와 기능을 허용하지만 단순히 모든 교차 출처 요청을 허용하는 것보다 더 안전하다. CORS의 사양은 원래 W3C 권고안으로 출판되었으나 해당 문서는 구식(obsolete)인 상태이다. 현재 CORS를 정의하면서 활발히 유지보수된 사양은 WHATWG의 Fetch Living Standard이다.
Cross-Origin Request Blocked
- CORS errors - HTTP | MDN
- Reason: CORS header 'Access-Control-Allow-Origin' missing - HTTP | MDN
- 3 Ways to Fix the CORS Error — and How the Access-Control-Allow-Origin Header Works | by David Katz | Medium
"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at $somesite"
서버측에서 Response Header에 추가해야 한다:
개발용 서버에만 와일드 카드(*
)를 사용하자.
배포용 서버에는 정확한 Origin
을 입력하자.
CORS는 멍청하다
- CORS는 브라우저 설계 결함을 보완하기 위한 임시방편임을 이해하세요.
- CORS(교차 출처 리소스 공유)는 교차 출처 요청의 암묵적 자격 증명으로 인한 보안 문제를 해결합니다.
- 브라우저의 기본 동작은 사용자에게 XSRF 공격에 노출될 위험을 초래합니다.
- CORS는 이러한 문제를 완화하려 하지만, 보안 범위에서 근본적인 한계를 가지고 있습니다.
- CORS는 교차 출처 요청의 결과를 읽는 것을 방지하지만, 요청 자체는 차단하지 않습니다.
- fun-games.example은 your-bank.example의 데이터를 읽을 수 없지만, 자금 이체와 같은 상태 변경 요청을 여전히 실행할 수 있습니다.
- 이는 브라우저가 쿠키와 자격 증명을 기본적으로 처리하는 방식 때문입니다.
- 효과적인 교차 출처 보안은 암묵적 자격 증명을 무시하는 것에서 시작됩니다.
- 교차 출처 요청에서 쿠키와 유사한 자격 증명을 제거하거나 명시적으로 허용합니다.
- Sec-Fetch-* 헤더를 활용하여 교차 출처 쿠키를 필터링하거나 제거하는 미들웨어를 사용합니다.
- 명시적 자격 증명은 암묵적 자격 증명보다 안전한 대안입니다.
- 쿠키 대신 인증 토큰에 Authorization 헤더를 사용합니다.
- 명시적 자격 증명은 다른 사이트 간의 자격 증명 오용을 방지합니다.
- 서버 렌더링 사이트에는 적합하지 않지만 API와 클라이언트 측 애플리케이션에는 최적의 방법입니다.
- SameSite 쿠키를 구현하여 교차 출처 자격 증명 사용을 제한하세요.
- 기본적으로 교차 출처 요청에 쿠키가 포함되지 않도록 SameSite=Lax를 사용합니다.
- 더 엄격한 정책을 위해 SameSite=Strict를 선택하세요. 다만, 이로 인해 사용성(예: 교차 출처 탐색 후 로그아웃)에 영향을 줄 수 있습니다.
- 간단하고 안전한 CORS 정책을 채택하세요.
- 기본 정책: Access-Control-Allow-Origin: * 및 Access-Control-Allow-Methods: *는 익명 액세스만 허용합니다.
- 이 정책은 교차 출처 요청의 암묵적 자격 증명을 비활성화하여 의도치 않은 자격 증명 오용으로부터 사이트를 보호합니다.
- 보안을 위해 CORS 정책을 지나치게 복잡하게 만들지 마세요.
- 지나치게 구체적으로 설정하면 잘못된 보안 감각을 만들 수 있습니다.
- CORS 프록시 및 기타 해결 방법은 브라우저가 강제하는 정책을 우회할 수 있어 액세스 제한 노력을 무효화합니다.
- 더 안전한 웹 기본값으로 이동하는 광범위한 움직임을 이해하세요.
- 브라우저는 교차 출처 자격 증명 문제를 해결하기 위해 State Partitioning(파이어폭스), Tracking Prevention(사파리), CHIPS(크롬)과 같은 방식을 탐구하고 있습니다.
- 이러한 이니셔티브는 출처 간 쿠키 및 자격 증명 공유를 제한하여 사용자 보안 및 개인 정보를 개선하려고 합니다.
- CORS가 불완전한 솔루션임을 인식하세요.
- CORS의 하위 호환성은 복잡성을 추가하면서도 기본 보안 문제를 완전히 해결하지 못합니다.
- 브라우저는 이러한 문제를 완화하기 위해 새로운 접근 방식을 천천히 채택하고 있지만, 진행 상황은 일관되지 않습니다.
See also
Favorite site
- Wikipedia (en) Cross-origin resource sharing
- [추천] CORS는 왜 이렇게 우리를 힘들게 하는걸까? 1
- CORS란 무엇인가? – 한윤석 개발 블로그
- CORS란 무엇입니까? - 교차 오리진 리소스 공유 설명 - AWS
References
-
Why_we_need_to_know_about_CORS_-_Evans_Library.pdf ↩