Network

CORS (Cross-Origin Resource Sharing)

주인장 꼬비 2023. 2. 19. 21:07

CORS (Cross-Origin Resource Sharing) = 교차 출처 리소스 공유 (다른 출처 리소스 공유)

 

 

Network 탭 Headers 부분

 

General

 

Response Headers

 

 

Request Headers

 

Request Headers에서  origin: https://platform.twitter.com

Response Headers에서 access-control-allow-origin: https://platform.twitter.com

 

이 경우에는 브라우저에서 보낸 출처(origin)와 서버에서 응답해준 접근이 가능한 출처(access-control-allow-origin)가 동일한 경우에는 CORS 에러가 발생하지 않는다.

 

만약 origin 과 access-control-allow-origin이 달랐다면 CORS에러가 발생했을 것 이다.

 

 

CORS에러 발생 예시

Access to fetch at 'https://api-kkeolmusae.com/v2/test' from origin 'https://kkeolmusae.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 
If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
main.8aa7e1b6663d6e10e0c9.bundle.js?8aa7e1b6663d6e10e0c9:1          GET https://api-kkeolmusae.com/v2/test net::ERR_FAILED 502
상황 : 브라우저에서 서버로 요청을 했으나, 서버에 Access-Control-Allow-Origin 정보가 없어서 에러가 발생 (서버에서 허용x)

 

 

 

+ 다른 출처로 요청할 때 세션이나 쿠키 정보를 담아야할 때, api를 호출할 때 `credentials: "include", `를 추가해야 한다.

fetch('https://example.com', {
  credentials: 'include',
});

그리고 서버에서도 

cors({
	origin: "https://www.example.com", // 허용하고자 하는 도메인. "*" 는 사용하지 못한다.
	credentials: true, // credentials: true 라는 옵션은 다른 도메인 간에 쿠키 공유를 허락할 때 사용한다.
}),

이런 식으로 설정해줘야 한다.

 

 

 

다만 서버쪽 cors 설정을 다음과 같이 할 수도 있는데

cors({
	origin: true,
	credentials: true,
}),

origin: true 라는 것은 모든 출처(origin)에서 오는 요청을 다 받겠다 라는 것이라 보안에 취약하다.

 

(origin: "*" 와 origin: true는 다르다.)

 

origin: true는 도메인 주소가 자동으로 Access-Control-Allow-Origin에 들어간다.

origin: "*" (와일드카드): 브라우저에 리소스에 접근하는 임의의 origin으로부터의 요청 코드를 허용한다.

 

 

굉장히 도움이 많이된 자료들

https://www.zerocho.com/category/NodeJS/post/5e9bf5b18dcb9c001f36b275

 

https://www.zerocho.com/category/NodeJS/post/5e9bf5b18dcb9c001f36b275

 

www.zerocho.com

 

https://evan-moon.github.io/2020/05/21/about-cors/

 

CORS는 왜 이렇게 우리를 힘들게 하는걸까?

이번 포스팅에서는 웹 개발자라면 한번쯤은 얻어맞아 봤을 법한 정책에 대한 이야기를 해보려고 한다. 사실 웹 개발을 하다보면 CORS 정책 위반으로 인해 에러가 발생하는 상황은 굉장히 흔해서

evan-moon.github.io

 

https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-CORS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-cors-%EB%AA%A8%EB%93%88

 

[NODE] 📚 cors 모듈 - CORS 간편 설정하기

CORS 허용 설정 하는 방법 Node.js 서버 프로젝트에서 cors(cross origin resource sharing) 문제를 해결하는 방법은 크게 2가지가 있다. 하나는 직접 헤더를 명시해서 출처(origin)을 필터링하는 것이고, 다른

inpa.tistory.com

 

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-CORS-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%F0%9F%91%8F

 

[WEB] 📚 악명 높은 CORS 개념 & 해결법 - 정리 끝판왕 👏

악명 높은 CORS 에러 메세지 웹 개발을 하다보면 반드시 마주치는 멍멍 같은 에러가 바로 CORS 이다. 웹 개발의 신입 신고식이라고 할 정도로, CORS는 누구나 한 번 정도는 겪게 된다고 해도 과언이

inpa.tistory.com

 

https://developer.mozilla.org/ko/docs/Web/API/Fetch_API/Using_Fetch

 

Fetch 사용하기 - Web API | MDN

Fetch API는 HTTP 파이프라인을 구성하는 요청과 응답 등의 요소를 JavaScript에서 접근하고 조작할 수 있는 인터페이스를 제공합니다. Fetch API가 제공하는 전역 fetch() (en-US) 메서드로 네트워크의 리소

developer.mozilla.org

 

https://chuckchoiboi.github.io/cors-tutorial/

 

CORS Tutorial

 

chuckchoiboi.github.io

 

https://www.hahwul.com/2019/04/10/why-failed-get-data-with-this-cors-policy/

 

Access-Control-Allow-Origin가 wildcard(*)일 때 왜 인증 정보를 포함한 요청은 실패하는가 😫

TL;DR CORS 정책 상 Access-Control-Allow-Origin: * 인 경우 Origin의 제한없이 요청하고 결과를 읽을 수 있지만, 이러한 경우 쿠키를 제거하고 요청하도록 정책이 구성되어 있어서 인증 정보를 포함한 요청

www.hahwul.com

 

'Network' 카테고리의 다른 글

CDN (Content Delivery Network) 모음 (+CloudFlare)  (0) 2023.08.12