프런트엔드 개발에 가장 많은 영향을 주는 크롬 브라우저의 버전별 변경 예정 항목을 정리 및 공유한다.
💡 각 항목은 Chrome Platform Status의 Roadmap과 한 달간의 blink-dev 활동 요약을 바탕으로 정리했다.
💡 각 항목의 🚫는 지원 중단 및 제거(Removed), ⚠️는 지원 중단(Deprecated), ✅는 새로운 기능(Enabled by default), 🧪는 개발자 미리 보기(Trial)를 의미한다.
💡 각 항목 중 기존 서비스에 미치는 영향이 크다고 판단한 항목은 소제목 뒤에 📌 표시를 했다.
💡 지원 중단 및 제거(🚫), 지원 중단(⚠️) 외의 항목은 공유 가치가 있다고 판단한 경우에만 포함했다.
💡 개발자 미리 보기(🧪)는 chrome://flags
에서 Experimental Web Platform features
항목을 활성화해 사용할 수 있다.
💡 각 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 Chrome Platform Status를 그대로 인용했다.
RTCPeerConnection.getStats()
콜백 방식 지원 중단@scope
규칙shadowroot
속성 지원 중단appearance
속성값 지원 중단 📌CSS의 -webkit-highlight
속성은 특정 텍스트를 강조하기 위해 고안된 속성이다. 하지만 이 속성은 표준화되지 못했고, 2014년 WebKit 엔진도 이 속성을 제거하였다.
현재 크로미움도 이 속성에 대해 아무런 시각적 표현을 노출하지 않아 해당 속성을 지원 중단한다. 아직 표준은 아니나, 시각적 표현이 있는 대체 방안으로 Highlight Pseudo-elements를 추천한다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
SHA(Secure Hash Algorithm)는 해시 함수의 집합이다. 그 중에서도 SHA-1은 과거 인증서와 전자 서명에 가장 많이 사용하던 해싱 알고리즘으로,1995년에 처음 등장해 2000년대부터 2010년대 초반까지 표준으로 널리 사용했다. 하지만 취약점이 제기되어 2011년에 SHA-2가 새로운 표준 해싱 알고리즘이 되었고, 현재 대부분의 최신 OS, 브라우저에서 SHA-1 알고리즘을 지원하지 않는다.
Chrome도 이미 과거에 SHA-1을 사용한 서버 인증서를 지원 중단했다. Chrome 117부터는 SHA-1을 사용한 서버 전자 서명을 거부할 예정이다. SHA-1을 사용하는 클라이언트의 인증서나 전자 서명은 아직 지원 중단 일정이 없어, 보안을 강화하고자 한다면 서버에서 직접 SHA-1을 사용한 인증서를 거부 처리해야 한다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
RTCPeerConnection.getStats()
콜백 방식 지원 중단RTCPeerConnection.getStats()
는 해당 오디오나 비디오 연결에 대한 통계 자료를 반환하는 API다. 현재 Chrome에서 이 API는 프로미스를 반환하는 최신 버전과, 콜백을 사용하는 구버전 두 가지로 나뉜다.
const result = await myPeerConnection.getStats(); // Promise 버전
myPeerConnection.getStats(null, onSuccess, onFailure); // 구버전, Promise 반환 X
콜백 방식은 모던 자바스크립트와 어울리지 않고, 표준 스펙 문서도 없어 장기적으로 지원을 중단할 예정이다. Chrome 113 이상에서는 콜백 방식 사용 시 콘솔에 경고를 노출하며, chrome://flags
에서 지원 중단 환경을 미리 체험할 수 있다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
순회 가능한 객체를 특정 키로 묶는 Object.groupBy()
와 Map.groupBy()
메서드를 추가한다.
각 메서드는 결과를 Object
, Map
으로 반환하며, Map.groupBy
는 기존 Map
처럼 키 값으로 객체를 사용할 수 있다는 점이 다르다.
const inventory = [
{ name: 'Tato', type: 'consumable', quantity: 5 },
{ name: 'Purified water', type: 'consumable', quantity: 8 },
{ name: 'Duct tape', type: 'junk', quantity: 0 },
];
const inventoryTypeGroup = Object.groupBy(inventory, ({ type }) => type);
console.log(inventoryTypeGroup);
/* console.log
{
consumable: [
{ name: 'Tato', type: 'consumable', quantity: 5 },
{ name: 'Purified water', type: 'consumable', quantity: 8 },
],
junk: [
{ name: 'Duct tape', type: 'junk', quantity: 0 },
],
}
*/
const hasItem = { hasItem: true };
const emptyItem = { hasItem: false };
const hasItemMap = Map.groupBy(inventory, ({ quantity }) => (quantity ? hasItem : emptyItem));
console.log(hasItemMap.get(hasItem));
/* console.log
[
{ name: 'Tato', type: 'consumable', quantity: 5 },
{ name: 'Purified water', type: 'consumable', quantity: 8 },
]
*/
console.log(hasItemMap.get(emptyItem));
/* console.log
[
{ name: 'Duct tape', type: 'junk', quantity: 0 },
]
*/
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
특정 요소에 기반해 현재 요소를 배치할 수 있는 Anchor 배치 모듈을 추가한다. 특히 툴팁 등을 구현할 때 유용한데, absolute
배치와 비슷하나 DOM 구조에 구애받지 않고 툴팁을 구현할 수 있다는 점이 다르다.
.anchor {
anchor-name: --tooltip;
}
.tooltip {
position: fixed;
anchor-default: --tooltip;
bottom: anchor(auto);
left: anchor(right);
min-width: anchor-size(width);
}
예제처럼 코드를 작성하면 .tooltip
은 .anchor
요소의 오른쪽 위에 나타난다. 만약 .tooltip
이 브라우저 화면을 벗어난다면 bottom: anchor(auto)
에 의해 .anchor
요소의 아래에 배치된다.
anchor-name
에는 해당 Anchor의 이름을 선언하며, 해당 Anchor에 배치할 요소에서 이 이름으로 해당 요소의 위치나 크기 등에 접근할 수 있다. anchor()
함수는 해당 Anchor의 위치값을, anchor-size()
는 해당 Anchor의 크기값을 반환하는 함수로, 기본적으로 아래처럼 Anchor의 이름을 인자로 받는다.
.tooltip {
bottom: anchor(--tooltip auto);
max-width: anchor-size(--tooltip width);
}
만약 해당 요소에 anchor-default
를 설정했다면 첫 번째 인자를 생략할 수 있다.
.tooltip {
anchor-default: --tooltip;
bottom: anchor(auto);
max-width: anchor-size(width);
}
@position-fallback
규칙을 선언하면 해당 요소가 브라우저 화면을 벗어날 경우에 대한 스타일을 정의할 수 있다.
@position-fallback --tooltip-position {
@try {
top: anchor(--tooltip bottom);
left: anchor(--tooltip left);
}
@try {
bottom: anchor(--tooltip top);
left: anchor(--tooltip left);
}
@try {
top: anchor(--tooltip bottom);
right: anchor(--tooltip right);
}
}
#tooltip {
position: fixed;
position-fallback: --tooltip-position;
}
위 코드는 먼저 Anchor의 왼쪽 아래에 배치를 시도하며, 만약 화면을 벗어나면 Anchor의 왼쪽 위, 마지막으로 Anchor에 오른쪽 아래에 #tooltip
을 배치하라는 의미이다.
이 기능은 아직 초안으로 세세한 스펙이나 동작이 바뀔 수 있음에 주의하자.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
CSS에 @starting-style
규칙을 추가한다. 기존 CSS 트랜지션은 요소가 처음 그려질 때나 display
속성이 none
에서 다른 값으로 바뀔 때는 트랜지션을 적용하지 않는다. 현재는 이런 애니메이션을 적용하려면 requestAnimationFrame
를 사용하는 등 스크립트 처리가 필요하다.
.box {
transition: background-color 0.3s;
background-color: pink;
}
.box-entered {
background-color: lime;
}
window.requestAnimationFrame(() => {
document.querySelector('.box').classList.add('.box-entered');
});
Chrome 117에서 추가 예정인 @starting-style
을 사용하면 간편하게 요소의 초기 스타일을 지정할 수 있다.
.box {
transition: background-color 0.3s;
background-color: lime;
}
@starting-style {
.box {
background-color: pink;
}
}
위 코드에서 .box
는 앞선 예시와 마찬가지로 요소가 처음 그려질 때 pink
에서 lime
으로 배경색이 전환된다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
줄바꿈 시 마지막 줄에 한 단어만 남지 않도록 하는 text-wrap: pretty
속성값을 추가한다. Chrome 114에서 추가된 text-wrap: balance
와 유사하나, text-wrap: balance
는 여러 단어를 마지막 줄로 내릴 수 있는데 반해 text-wrap: pretty
는 마지막 줄이 한 단어일 때, 한 단어만을 추가로 내린다.
(출처: Score-based Paragraph-level Line Breaking)
위 이미지에서 가장 위가 text-wrap: auto
, 중간이 text-wrap: pretty
, 아래가 text-wrap: balance
이다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Iterator
객체에 prototype
및 각종 메서드를 추가한다. 이번에 추가되는 메서드는 .map(mapperFn)
, .filter(filtererFn)
, .find(fn)
, .forEach(fn)
등으로 기존에 배열에서 사용하던 메서드와 기능적으로 유사하다.
function* naturals() {
let i = 0;
while (i < 10) {
yield i;
i += 1;
}
}
const mapResult = naturals().map((v) => v * 10);
mapResult.next(); // {value: 0, done: false}
mapResult.next(); // {value: 10, done: false}
mapResult.next(); // {value: 20, done: false}
const filterResult = naturals().filter((v) => v % 2 === 0);
filterResult.next(); // {value: 0, done: false}
filterResult.next(); // {value: 2, done: false}
filterResult.next(); // {value: 4, done: false}
naturals().find((v) => v > 1); // 2
naturals().forEach((v) => {
console.log(v);
});
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
CSS Transition 시 불연속(discrete
) 속성을 고려하도록 지시할 수 있는 transition-behavior
속성을 추가한다.
불연속 속성이란 중간값을 연산할 수 없는 display
, visibility
등을 말한다. 이들은 중간값을 연산할 수 없어 transition
속성과 함께 사용할 수 없었다.
기존에는 특정 애니메이션이 끝난 후 display: none;
속성을 적용하려면 자바스크립트로 직접 스타일을 변경해야 했다.
.hide {
transition: opacity 0.3s;
opacity: 0;
/* display: none; */
}
const target = document.querySelector('#target');
target.addEventListener('transitionend', () => {
target.style.setProperty('display', 'none');
});
target.classList.add('hide');
Chrome 117부터는 transition-behavior: allow-discrete
를 사용하면 transition-property
속성에 불연속 속성을 사용할 수 있다.
.hide {
transition: display 0.3s, opacity 0.3s;
transition-behavior: allow-discrete;
opacity: 0;
display: none;
}
const target = document.querySelector('#target');
target.classList.add('hide');
불연속 속성의 애니메이션 동작은 초기값에 따라 달라진다. 만약 애니메이션의 출발값과 도착값이 모두 화면에 나타나는 값(display: block
, visibility: visible
등)이라면, 해당 불연속 속성은 애니메이션 진행도가 50%일 때 출발값에서 도착값으로 바뀐다.
#target {
display: block;
transition: display 1s allow-discrete;
}
#target.flex {
display: flex;
}
const target = document.querySelector('#target');
target.classList.add('flex');
위 예제에서 #target
은 애니메이션 실행 약 0.5초 뒤에 display: flex
스타일이 적용된다.
반대로 출발값 또는 도착값이 화면에 나타나지 않는 값(display: none
, visibility: hidden
등)이라면 둘 중 화면에 보이는 값을 적용한다. 아래 예시에서 #target
은 애니메이션 출발부터 도착까지 display: block
스타일이 적용된다.
#target {
display: none;
opacity: 0;
}
.show {
transition: display 1s, opacity 1s;
transition-behavior: allow-discrete;
display: block;
}
const target = document.querySelector('#target');
target.classList.add('show');
transition-behavior
속성의 기본값은 normal
이며, 이때는 기존처럼 불연속 속성을 애니메이션 대상에서 제외한다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
unload
이벤트는 해당 문서 또는 자식 문서를 해제할 때 발생하는 이벤트이다. 이 이벤트를 이용하면 사용자가 페이지를 종료하기 전에 특정 동작을 실행할 수 있다.
window.addEventListener('unload', (event) => {
navigator.sendBeacon('/api/log', 'unload!');
});
하지만 unload
이벤트는 beforeunload
이벤트와 달리 기본 동작을 취소(event.preventDefault()
)할 수 없어 이벤트가 아예 발생하지 않기도 한다. W3C의 통계에 따르면 unload
이벤트가 제대로 발생하는 경우가 Chrome 데스크탑에서는 95%, 모바일에서는 57% ~ 68% 정도로, 이는 모바일 환경의 특성상 브라우저가 아닌 다른 앱을 보다가 브라우저 자체를 종료하는 경우가 빈번하기 때문이다.
이번에 추가되는 것은 unload
이벤트의 허용 여부를 결정하는 Permission-Policy
의 미리 보기로, 기본값은 허용이다. Chrome은 점진적으로 unload
이벤트를 제거한다는 계획으로, 먼저 Permission-Policy
를 추가하고, 기본값을 deny
로 바꾸며, 결과적으로는 unload
이벤트 자체를 제거할 계획이다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Chrome 117은 2023년 9월 6일에 정식 배포 예정이다. 8월 16일부터 8월 24일 사이에 Chrome 베타 버전에서 해당 기능을 미리 확인해 볼 수 있다.
Chrome 105에서 초안을 기반으로 구현했던 Sanitizer API
를 제거한다. 논의 과정에서 명세가 많이 변경되어 초안의 구현체를 사용하는 페이지가 많아지는 것을 사전에 방지하기 위한 조치다.
Sanitizer API
는 아직 논의 중이며, 정식 반영 일정은 불투명하다. 변경점이 더 있을 수 있으니 참고하자.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
@scope
규칙CSS 표준으로 제안 중인 @scope
규칙을 적용한다. @scope
는 CSS 규칙을 특정 구간에만 적용할 수 있는 문법으로, CSS에 스코프라는 새로운 개념이 생기는 셈이다.
@scope
규칙을 단순하게 사용하면 다음과 같다.
@scope (.red-theme) {
span {
color: red;
}
}
@scope (.blue-theme) {
span {
color: blue;
}
}
위 문법은 아래처럼 일반 선택자로 구현할 수도 있으나, 꽤 큰 차이가 있다.
.red-theme span {
color: red;
}
.blue-theme span {
color: blue;
}
예를 들어 아래와 같은 페이지가 있다고 해 보자.
<div class="blue-theme">
<span>this is blue-theme</span>
<div class="red-theme">
<span>this is red-theme</span>
</div>
</div>
일반 선택자로 구현한 스타일을 적용하면 두 <span>
텍스트는 모두 파란색으로 나타난다. .blue-theme span
과 .red-theme span
의 CSS 우선 순위가 같아 나중에 선언한 .blue-theme span
의 스타일이 .red-theme span
의 스타일을 덮어씌우기 때문이다.
@scope
규칙으로 작성한 스타일을 적용하면 의도대로 첫 번째 <span>
은 파란색, 두 번째 <span>
은 빨간색으로 나타난다. @scope
는 @scope
에 선언한 상위 스코프에 해당 요소가 가까울수록 우선 순위가 높다. 때문에 두 번째 <span>
에 스타일을 적용할 때 @scope (.blue-theme)
에서 선언한 규칙보다 @scope (.red-theme)
에서 선언한 규칙이 우선 순위가 더 높아 color: red;
스타일이 color: blue;
스타일을 덮어씌운다.
또한 @scope A to B
규칙을 사용하면 아래처럼 스타일의 적용 범위를 설정할 수 있고,
@scope (.article) to (.comment) {
p {
margin: 12px 0;
}
}
&
선택자 또는 :scope
가상 선택자를 이용하면 현재 상위 스코프 요소를 선택할 수 있다.
@scope (.light-theme) {
& {
background-color: white;
}
}
@scope (.dark-theme) {
:scope {
background-color: black;
}
}
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
navigator.clipboard
로 접근 가능한 Clipboard
의 read()
, write()
메서드의 동작을 DataTransfer API
와 일관되게 사용할 수 있도록 변경한다. 내부 동작의 변경점도 있으나, 개발자 입장에서는 Clipboard.read()
메서드에 두 번째 인자로 옵션 객체를 보내 정제되지 않은 HTML을 받을 수 있다는 것이 가장 큰 차이점이다.
try {
const textInput = '<style>p { color: blue; }</style><p>Hello, World!</p>';
const blobInput = new Blob([textInput], { type: 'text/html' });
const clipboardItem = new ClipboardItem({ 'text/html': blobInput });
await navigator.clipboard.write([clipboardItem]);
} catch (e) {
console.log('Failed to write.');
}
try {
const clipboardItems = await navigator.clipboard.read({ unsanitized: ['text/html'] });
const blobOutput = await clipboardItems[0].getType('text/html');
const outputHtml = await new Response(blobOutput).text();
console.log(outputHtml); // <style>p { color: blue; }</style><p>Hello, World!</p>
} catch (e) {
console.log('Failed to read clipboard.');
}
현재는 브라우저에서 항상 정제된 HTML(예시: <p>Hello, World!</p>
)을 반환한다. 이 HTML은 스타일 등의 태그가 없을 뿐더러 스타일을 인라인화 하기 때문에 크기도 굉장히 커질 수 있다. 개발자는 정제되지 않은 클립보드 HTML에 접근하려면 DataTransfer API
등을 활용해야만 한다.
다만 사파리에서는 이 기능에 부정적인 입장이어서 이 기능이 표준으로 등록되긴 어려워 보인다. 사파리에서는 사이트의 출처(origin)가 다르거나 다른 애플리케이션으로 이동할 때만 HTML을 정제하는 정책을 그대로 가져간다는 입장이다.
Chrome은 사파리와 별도로 118 버전에서 해당 기능의 미리 보기를 추가하고, 121 버전에서 해당 기능을 기본 적용할 예정이다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Chrome 118은 2023년 10월 4일에 정식 배포 예정이다. 9월 13일부터 9월 21일 사이에 Chrome 베타 버전에서 해당 기능을 미리 확인해 볼 수 있다.
shadowroot
속성 지원 중단선언적 Shadow DOM은 <template>
요소에 shadowroot
속성을 지정해 템플릿에서 직접 Shadow DOM을 활성화할 수 있는 기능이다. 표준에서 이 속성에 대한 이름을 shadowrootmode
로 변경함에 따라 기존 shadowroot
속성을 지원 중단한다. shadowroot
는 Chrome에서 그대로 동작하나, Chrome 111에서 추가된 스트리밍 기능을 사용할 수 없다. shadowrootmode
는 Chrome 111 이상에서 사용할 수 있으며, 다른 브라우저에서도 지원 예정이므로 shadowrootmode
속성을 사용하는 것이 좋다.
<host-element>
- <template shadowroot="open">
+ <template shadowrootmode="open">
<slot></slot>
</template>
<h2>Light content</h2>
</host-element>
Chrome 112에서 shadowroot
속성에 대한 지원 중단 미리 보기를 추가했다. Chrome 112 이상에서 chrome://flags
에서 해당 기능을 활성화해 속성 지원 중단을 미리 체험할 수 있다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
shadowroot
attribute for declarative shadow DOM (Deprecated)WebSQL
은 과거 브라우저에 데이터를 저장하기 위해 제안된 API로, Webkit 기반의 일부 브라우저에서만 사용이 가능했다. 하지만 이 프로젝트는 보안 구현 등의 어려움으로 1년 만에 폐기되었고, Webkit도 2019년에 이 API를 지원 중단했다.
이미 대부분의 브라우저에서 Web Storage API
, IndexedDB API
같은 최신 저장소 API를 사용할 수 있어 이 API를 지원 중단한다. 이미 Chrome 97에서 제3자 컨텍스트에서 WebSQL을 제거했으며, Chrome 105에서는 보안 연결을 사용하지 않는 페이지에서의 사용을 지원 중단했다.
웹에서 SQL을 계속 사용하려면 웹 어셈블리를 이용한 SQLite가 공식 대안이므로 참고하자.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Chrome 119은 2023년 11월 1일에 정식 배포 예정이다. 10월 11일부터 10월 19일 사이에 Chrome 베타 버전에서 해당 기능을 미리 확인해 볼 수 있다.
MutationEvent
는 DOM 요소에 변경이 있을 때 발생하는 이벤트로, DOMSubtreeModified
, DOMNodeInserted
, DOMNodeRemoved
등이 있다.
element.addEventListener(
'DOMNodeInserted',
(event) => {
console.log('새로운 요소를 감지했습니다.', event.srcElement);
},
false
);
element.append(document.createElement('span'));
// 새로운 요소를 감지했습니다. <span></span>
이 이벤트를 사용하면 DOM 변경을 추적할 수 있으나, 설계상 결함과 치명적인 성능 문제를 이유로 2011년에 표준에서 퇴출되었다.
2012년에 더 안정적인 MutationObserver
가 등장하여 현재 대부분의 브라우저에서 이 이벤트 사용 시 콘솔에 경고를 노출한다. 아직 MutationEvent
를 사용한다면 MutationObserver
로 전환할 것을 적극 권장한다.
const observer = new MutationObserver((mutations) => {
for (const mutation of mutations) {
if (mutation.type === 'childList') {
console.log('새로운 요소를 감지했습니다.', ...mutation.addedNodes);
}
}
});
observer.observe(element, { childList: true });
element.append(document.createElement('span'));
// 새로운 요소를 감지했습니다. <span></span>
Chrome 115부터는 Mutation 이벤트 사용 시 좀 더 강력한 경고를 노출하며, 내년 7월 말 배포 예정인 Chrome 127에서는 해당 API를 제거할 계획이다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
appearance
속성값 지원 중단 📌CSS의 appearance
속성은 네이티브 UI의 외형을 변경할 때 사용한다. 기존에 Chrome은 appearance
와 -webkit-appearance
속성의 값으로 표준에 없는 값들도 다수 지원했으나, 추후에 비표준 속성값을 지원 중단할 예정이다. 아래 속성은 비표준으로 업데이트 이후 사용할 수 없는 속성값이다.
inner-spin-button
media-slider
media-sliderthumb
media-volume-slider
media-volume-sliderthumb
push-button
searchfield-cancel-button
slider-horizontal
sliderthumb-horizontal
sliderthumb-vertical
square-button
아직 정식 중단 지원 일정은 불분명하나, 해당 속성값에 의존하는 UI가 있다면 직접 구현하는 것으로 대체가 필요하다. 지원 중단 미리 보기는 Chrome 115 이상에서 사용할 수 있다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
appearance
property내부망 접근 규칙(Local Network Access) 적용의 일부로 하위 리소스(.js
, .css
등)를 요청할 때 내부망(사설 IP, localhost)에 대한 접근 제한을 검토 중이다. 정식 적용 일정은 불투명하나, 미리 보기로 일부 기능을 체험할 수 있다.
공개 웹 사이트(공개 IP로 접근 가능한 사이트)에서 내부망에 하위 리소스(.js
, .css
등) 요청 시 반드시 보안 컨텍스트(HTTPS)를 사용하도록 제한한다. 내부망의 하위 리소스에 접근하려면 보안 컨텍스트를 사용하도록 변경해야 한다.
Chrome 86 이상의 chrome://flags
에서 해당 기능을 활성화해 접근 제한을 미리 체험할 수 있다.
내부망에 하위 리소스 요청 시 사전 요청을 보내 연결 허용 여부를 먼저 묻는다. 현재는 사전 요청 실패 시 개발자 콘솔에 경고만 노출한다.