---
title: "메시지와 파일, 줄을 숨기는 스크립트 오류 Script error 해결하기"
description: "Script error.가 줄 0, 스택 없이 뜨면 브라우저가 다른 출처 스크립트의 오류를 숨긴 거예요. crossorigin과 CORS 헤더를 더하면 메시지를 다시 받아요."
canonical: "https://logbrew.co/ko/errors/script-error"
last_updated: "2026-11-10"
---

# 메시지와 파일, 줄을 숨기는 스크립트 오류 Script error 해결하기

`Script error.`가 줄 0, 스택 없이 뜨면 브라우저가 다른 출처 스크립트의 오류를 숨긴 거예요. `crossorigin`과 CORS 헤더를 더하면 메시지를 다시 받아요.

Chromium 152, @logbrew/browser 0.1.21 및 @logbrew/sdk 0.1.44 환경에서 2026년 11월 10일에 테스트

글 [Furkan Erday](https://github.com/furkanerday). LogBrew 창업자 Furkan Erday. 매일 Claude Code와 Codex로 LogBrew를 만들어요.

Canonical: https://logbrew.co/ko/errors/script-error

## 스크립트가 오류를 던질 때 페이지가 알 수 있는 것

| 스크립트를 불러온 방법 | 스크립트 실행 | 오류 상세 |
| --- | --- | --- |
| 페이지와 같은 출처에서 | 실행됨 | 전체 |
| 다른 출처에서 | 실행됨 | `Script error.` |
| 다른 출처, `crossorigin`과 CORS 헤더 있음 | 실행됨 | 전체 |
| 다른 출처, `crossorigin`은 있고 헤더 없음 | 차단됨 | 없음 |

스크립트 1개를 4가지 방법으로 불러왔어요. 전체는 `window`의 `error` 이벤트에서 메시지, 파일, 줄 1, 열 7, 스택을 모두 읽었다는 뜻이에요.

## 전체 오류 다시 받기

### crossorigin 속성으로 스크립트 불러오기

이 속성은 브라우저에게 파일을 CORS로 가져오라고 알려요. 서버가 허용하면 브라우저는 실제 메시지, 파일, 줄, 스택을 페이지의 오류 리스너에 넘겨요.

```bash
<script src="https://cdn.example.com/app.js" crossorigin="anonymous"></script>
```

### 파일을 제공하는 서버에서 CORS 헤더 보내기

스크립트를 호스팅하는 서버는 `Access-Control-Allow-Origin`을 페이지 출처로, 공개 파일이면 `*`로 설정해 응답해야 해요. 테스트에서는 이 헤더 하나만으로 `Script error.`가 전체 메시지로 바뀌었어요.

```bash
Access-Control-Allow-Origin: *
```

### 파일이 여전히 로드되는지 확인

`crossorigin`을 설정하고 헤더가 없으면 브라우저가 파일을 차단하고 스크립트는 아예 실행되지 않아요. 콘솔에는 `blocked by CORS policy`와 `net::ERR_FAILED`가 뜨고, `script` 요소에서 `error` 이벤트가 발생해요.

출력

```text
Access to script at 'http://127.0.0.1:4874/plain/throws.js?scenario=script-cross-origin-attr-no-header' from origin 'http://127.0.0.1:4873' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Failed to load resource: net::ERR_FAILED
```

### 아니면 스크립트를 내 출처에서 제공

페이지와 같은 출처의 스크립트는 오류가 숨겨지지 않아요. 파일을 앱과 함께 번들하거나 내 도메인을 거쳐 프록시하면 헤더가 필요 없어요.

## 그래도 남는 숨겨진 오류 다루기

### 개수를 세고 스크립트 찾기

`Script error.`에는 고칠 단서가 없어요. 하나하나가 다른 출처의 스크립트가 오류를 던졌다는 뜻이에요. `crossorigin`이 없는 태그를 찾고, 모든 페이지에서 로드되는 태그부터 시작하세요.

### 콘솔에서 실제 메시지 읽기

브라우저는 리스너에게는 오류를 숨겨도 콘솔에는 전체 오류를 출력해요. 테스트에서 `window.onerror`는 `Script error.`를 받았지만 콘솔에는 `Uncaught Error: Keg is empty`가 보였어요.

### 서드파티 태그는 어떻게 할지 정하기

CORS 헤더가 없는 채팅 위젯이나 분석 태그는 선택지가 2개예요. 그대로 두고 숨겨진 오류를 감수할 수도 있고, `crossorigin`을 더해 헤더 없는 태그가 차단되면서 로드 실패로 드러나게 할 수도 있어요.

## 직접 테스트해 보니

오류를 던지는 스크립트 1개, `throw new Error("Keg is empty: no beer left for order 42");`를 로컬 서버 2대에 올렸어요. 페이지는 `@logbrew/browser` 0.1.21을 설치한 Chromium 152에서 `http://127.0.0.1:4873`으로 실행했고, `http://127.0.0.1:4874`의 두 번째 서버가 CDN 역할을 했어요. 스크립트를 4가지 방법으로 불러오고 매번 `window`의 `error` 이벤트를 읽었어요.

페이지와 같은 출처에서는 이벤트에 `Uncaught Error: Keg is empty: no beer left for order 42`, 파일 `/throws.js`, 줄 1, 열 7, 그리고 스택이 있는 `Error` 객체가 담겼어요. `crossorigin` 없이 다른 출처에서 불러오면 이벤트에 `Script error.`, 빈 파일 이름, 줄 0, 열 0이 담기고 `Error` 객체는 없었어요. 콘솔에는 여전히 전체 메시지가 출력됐어요.

CDN에 `crossorigin="anonymous"`와 `Access-Control-Allow-Origin: *`를 붙이자 이벤트에 전체 정보가 다시 담겼어요. 속성만 있고 헤더가 없으면 브라우저가 파일을 차단해서 스크립트는 실행되지 않았고, `script` 요소에서 `error` 이벤트가 발생했어요.

## 브라우저가 메시지를 숨기는 이유

HTML 표준은 페이지가 CORS 없이 다른 출처에서 가져온 스크립트의 오류를 숨겨요. 표준의 알고리즘은 응답이 CORS 교차 출처일 때 muted errors 상태로 표시하고, 그 오류를 URL 없이, 줄 0, 열 0, 오류 객체 없이 `Script error.`로 보고해요.

브라우저는 교차 출처 스크립트의 오류 텍스트를 그 스크립트의 데이터로 취급해서 페이지에 하나도 주지 않아요. MDN의 `crossorigin` 문서도 1줄로 같은 말을 해요. 이런 스크립트는 `window.onerror`를 통한 오류 로깅 접근이 제한돼요.

whatwg/html#2440은 CORS 없이 상세 정보를 얻는 방법을 요청했어요. 2024년 7월, whatwg/html#10514가 브라우저마다 같은 경우를 같은 방식으로 숨기지 않는다고 보고하며 열린 날 닫혔어요. 그 이슈는 아직 열려 있어요.

## LogBrew가 기록하는 것

전체 정보가 있을 때 브라우저 SDK는 `Browser error: Error`라는 이슈 1개를 보냈어요. 여기에는 `/throws.js` 줄 1, 열 7의 스택 프레임, 소스 경로, 그룹화 키 `browser.error:Error:/throws.js`가 담겼어요. 오류를 던지는 스크립트마다 이슈가 하나씩 생겨요.

숨겨진 오류의 이슈는 이름은 같지만 스택 프레임이 없고, 줄 0, 열 0, 그룹화 키는 `browser.error:Error`였어요. 숨겨진 오류는 모두 이 이슈 1개에 모이니, 그 개수가 아직 볼 수 없는 오류가 몇 개인지 알려 줘요.

두 이벤트 모두 페이지 경로, `macOS`의 `Chromium 152` 런타임, `page_view` 브레드크럼을 담았어요. 메시지 텍스트는 둘 다 담지 않았어요. SDK가 `redacted`로 표시했어요.

## 자주 묻는 질문

### JavaScript에서 Script error.는 무슨 뜻인가요?

다른 출처의 스크립트가 오류를 던졌고, 파일을 CORS로 불러오지 않아서 브라우저가 페이지에 상세 정보를 숨긴 거예요. 스크립트 자체는 실행됐어요.

### Script error.는 왜 줄이 0이고 스택이 없나요?

HTML 표준은 오류를 숨길 때 메시지, 파일, 줄, 열, 오류 객체를 모두 바꿔요. 문자열 `Script error.`만 남아요.

### Script error.는 스크립트 로드 실패라는 뜻인가요?

아니요. 로드에 실패한 스크립트는 `script` 요소에서 `error` 이벤트를 발생시키고 실행되지 않아요. `Script error.`는 스크립트가 실행됐고 오류를 던졌다는 뜻이에요.

### 서버를 바꾸지 않고 메시지를 볼 수 있나요?

브라우저 콘솔에서는 볼 수 있어요. 오류 추적에서는 못 봐요. 태그에 `crossorigin`을 넣고 서버에서 CORS 헤더를 보내거나, 스크립트를 내 출처에서 제공해야 해요.

### 오류 추적에서 Script error.를 걸러내야 하나요?

걸러내지 말고 세어 보세요. 그 숫자는 아직 볼 수 없는 오류가 몇 개인지 알려 주고, 모든 교차 출처 스크립트를 CORS로 불러오면 0으로 떨어져요.

## 아직 볼 수 없는 오류 세어 보기

LogBrew 브라우저 SDK는 숨겨진 오류를 모두 이슈 1개에 모으고, 실제 오류에는 각각 파일, 줄, 스택을 붙여요. 넉넉한 무료 요금제로 시작하세요. 카드 등록은 필요 없어요.

[무료로 시작](https://logbrew.co/ko)

## 출처

- [MDN, Window: error event](https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event)
- [MDN, crossorigin attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/crossorigin)
- [HTML Standard, Runtime script errors](https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors)
- [whatwg/html#2440](https://github.com/whatwg/html/issues/2440)
- [whatwg/html#10514](https://github.com/whatwg/html/issues/10514)

## JavaScript 오류 해결법 더 보기

- [Failed to fetch 오류를 고치고 원인 3가지를 구분하는 방법](https://logbrew.co/ko/errors/failed-to-fetch)
- [직접 재현한 JavaScript 오류와 각각의 해결법](https://logbrew.co/ko/errors)
