웹 개발

html파일을 local에서 실행할 때 CORS 에러가 발생하는 이유

노루아부지 2022. 3. 2. 11:16

html파일을 tomcat 등에서 실행하지 않고 local(하드디스크 등)에서 직접 실행할 때, 다음과 같은 에러가 발생하는 경우가 있습니다.

 

Access to script at 'file:///C:/경로' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, edge, https, chrome-untrusted.

 

 

이 에러가 발생한 코드는 다음과 같습니다.

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>CORS</title>
</head>
<body>
    <script type="module" src="js/module.js"></script>
</body>
</html>

 

 

1. 해결방법을 먼저 말하면, 간단합니다.

서버에 올리면 됩니다.

 

 

 

 

그렇다면 왜 하드디스크에서 실행하면 CORS가 발생하는 것일까요?

 

2. 먼저 CORS는 다음과 같습니다.

 

교차 출처 리소스 공유(Cross-Origin Resource Sharing)의 약자입니다. 이것은 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있도록 권한을 부여하도록 브라우저에 알려주는 체제입니다.

 

보안상의 이유로 브라우저는 스크립트에서 시작한 교차 출처 HTTP 요청을 제한합니다. 즉, 웹 애플리케이션은 자신의 출처와 동일한 리소스만 불러올 수 있는데 이를 동일 출처 정책(Same Origin Policy, SOP)라고 합니다.

만약 다른 출처의 리소스를 불러오려면 그 출처에서 올바른 CORS 헤더를 포함한 응답을 반환해야 합니다.

 

이 때 출처를 구분하는 기준은 URI의 protocol, host, port 입니다.

 

 

 

3. 그런데... script에서 시작하지 않았는데?

<script type="module">의 특성

 

MDN의 javascript modules에 관한 설명에 따르면 type을 module로 설정한 <script> 태그가 포함된 HTML 파일을 로컬에서 불러올 경우 javascript 모듈 보안 요구사항으로 인해 CORS 오류가 발생한다고 합니다.

 

 

 

4. 이제 원래 에러 메시지를 확인합니다.

 

에러 메시지에서 말하는 내용은 다음과 같습니다.

c:/경로/의 html에서 null/ 로 요청했기 때문에 CORS 정책에 따라 제한된 것입니다. 즉, null/like_button.js 를 요청한 것 입니다.

 

이러한 에러가 발생하는 이유는 브라우저가 웹에서 로컬 파일에 접근하지 못하도록 하기 위해 이런 방법을 사용한다고 합니다.

 

 

 

[참조]

https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

https://velog.io/@takeknowledge/%EB%A1%9C%EC%BB%AC%EC%97%90%EC%84%9C-CORS-policy-%EA%B4%80%EB%A0%A8-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-3gk4gyhreu

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Modules

https://stackoverflow.com/questions/10752055/cross-origin-requests-are-only-supported-for-http-error-when-loading-a-local

 

 

 

728x90
loading