프런트엔드 개발에 가장 많은 영향을 주는 크롬 브라우저의 버전별 변경 예정 항목을 정리 및 공유한다.
💡 각 항목은 Chrome Platform Status의 Roadmap과 한 달간의 blink-dev 활동 요약을 바탕으로 정리했다.
💡 각 항목의 🚫는 지원 중단 및 제거(Removed), ⚠️는 지원 중단(Deprecated), ✅는 새로운 기능(Enabled by default)를 의미한다.
💡 각 항목 중 기존 서비스에 미치는 영향이 크다고 판단한 항목은 소제목 뒤에 📌 표시를 했다.
💡 지원 중단 및 제거(🚫), 지원 중단(⚠️) 외의 항목은 공유 가치가 있다고 판단한 경우에만 포함했다.
💡 각 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 Chrome Platform Status를 그대로 인용했다.
document.domain
설정자(Setter) 지원 중단 📌CollectedClientAdditionalPaymentData
의 rp
속성 이름 변경Headers.getSetCookie()
메서드 추가RTCPeerConnection.getStats()
콜백 방식 지원 중단 미리 보기 📌image-set()
함수 구문 추가WebAssembly.Module()
의 크기 제한 지원 중단display
, content-visibility
의 애니메이션 사용 지원zoom
속성 지원 중단 미리 보기 📌RTCPeerConnection.getStats()
콜백 방식 지원 중단 📌shadowroot
속성 지원 중단document.domain
설정자(Setter) 지원 중단 📌SOP(Same-Origin Policy)는 브라우저 보안 정책으로, 두 페이지가 서로 다른 출처(origin)일 때 이 두 페이지 사이의 통신을 막는다. 예를 들어 parent.example.com
페이지에 <iframe>
으로 child.example.com
페이지를 불러오면 기본적으로 child.example.com
은 window.parent
로 부모창에 접근할 수 없고, 이 반대도 마찬가지다. 기존에는 상위 도메인이 같은 경우, document.domain
설정자를 사용하여 상위 도메인(example.com
)으로 출처를 변경해 SOP를 완화할 수 있었다. 보다 강력한 보안을 위해 이 설정자를 지원 중단한다. 지원 중단 기간 동안 document.domain
설정자를 호출할 수는 있지만 출처는 변하지 않는다.
사용자가 직접 chrome://flags
에서 Origin-keyed agent clusters
기능을 설정해 기존처럼 document.domain
으로 출처를 변경할 수 있다. 하지만 기본 옵션이 아니기에 대안을 찾는 것이 좋다. 가장 간단한 대안은 window.postMessage
를 사용하는 것이다.
// parent.example.com
window.addEventListener('message', (event) => {
if (event.origin !== 'http://child.example.com') {
return;
}
console.log(event.data); // 안녕하세요?
});
// child.example.com
window.postMessage('안녕하세요?', 'http://parent.example.com');
window.postMessage
의 자세한 사용법 및 다른 대안은 여기를 참고해도 좋다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
FCM(Firebase Cloud Messaging) Sender ID는 구글의 클라우드 서비스를 이용할 때 생성되는 고유 ID이다. Chrome은 42 버전부터 이 ID를 통한 웹 푸시 알림를 지원했으나, 이는 Chrome만 지원하는 기능이었기에 지원 중단을 결정했다. 구글은 2019년 9월부터 더 이상 새로운 발송자(senders)를 생성하지 못하도록 막았으며, 기존 발송자에게도 경고를 발송했다.
아직까지 FCM Sender ID를 통해 웹 푸시 알림을 사용할 수 있는 것은 2019년 9월 이전에 등록한 발송자 뿐이다. 그마저도 일주일에 사용자가 1000명을 넘지 않아 이 기능을 완전히 지원 중단한다. 좀 더 많은 브라우저(엣지, 파이어폭스 등)를 지원하는 VAPID(Voluntary Application Server Identification)가 있으니 참고하자.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
CollectedClientAdditionalPaymentData
의 rp
속성 이름 변경SPC(Secure Payment Confirmation)는 결제 거래 중 간소화된 인증 절차를 제공하는 웹 API이다. WebAuthn을 기반으로 만들었으며, WebAuthn에서 CollectedClientAdditionalPaymentData
의 rp
(Relying Party, 신뢰 당사자) 속성의 이름을 rpId
로 변경함에 따라 표준에서도 rp
를 rpId
로 변경하였다. 변경된 표준을 반영하기 위해 rp
속성을 제거한다.
Chrome 107에서 먼저 CollectedClientAdditionalPaymentData
에 rpId
속성을 추가했으므로 rp
대신 rpId
를 사용하도록 변경해야 한다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Headers.getSetCookie()
메서드 추가HTTP 요청을 보낼 때 Set-Cookie
헤더는 여러 번 중복으로 선언할 수 있으며, 자동으로 합쳐지지 않는다. 하지만 현재 Headers
는 등록한 Set-Cookie
헤더를 따로 가져올 수 있는 기능을 제공하지 않는다. 예시로 Headers.get('Set-Cookie')
는 모든 Set-Cookie
헤더의 값을 합친 결과를 반환한다.
const headers = new Headers();
headers.append('Set-Cookie', 'a=1');
headers.append('Set-Cookie', 'b=2');
console.log(headers.get('Set-Cookie')); // a=1, b=2
HTTP의 규칙과 동일하게 Headers
의 Set-Cookie
를 배열로 반환하는 Headers.getSetCookie()
메서드를 추가한다. 일부 브라우저는 Headers
객체를 순회할 때 Set-Cookie
를 합치지 않는 기능도 먼저 적용했다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
RTCPeerConnection.getStats()
콜백 방식 지원 중단 미리 보기 📌RTCPeerConnection.getStats()
는 해당 오디오나 비디오 연결에 대한 통계 자료를 반환하는 API다. 현재 크롬에서 이 API는 프로미스를 반환하는 최신 버전과, 콜백을 사용하는 구버전 두 가지로 나뉜다.
myPeerConnection.getStats(); // 최신 버전
myPeerConnection.getStats(null, onSuccess, onFailure); // 구버전, Promise 반환 X
콜백 방식은 모던 자바스크립트와 어울리지 않고, 표준 스펙 문서도 없어 장기적으로 지원을 중단할 예정이다. Chrome 113에서는 콜백 방식 사용 시 콘솔에 경고를 노출하며, chrome://flags
에서 지원 중단을 체험할 수 있는 기능을 추가할 예정이다.
콜백 방식은 오는 9월 초에 정식 배포 예정인 Chrome 117에서 지원 중단 예정이다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
image-set()
함수 구문 추가image-set()
은 브라우저가 해상도에 따라 적절한 이미지를 선택해 보여줄 수 있도록 정의하는 CSS의 함수 구문이다.
.box {
background-image: image-set('sample.jpg' 1x, 'sample-2x.jpg' 2x);
}
.gradient {
background-image: image-set(
linear-gradient(white, black) 96dpi,
linear-gradient(red, blue) 150dpi
);
}
현재도 -webkit-
접두사를 붙여 image-set()
을 사용할 수 있으나, 해상도 단위로 x
밖에 사용하지 못한다.
Chrome 113부터는 접두사 없이도 image-set()
을 사용할 수 있다. 또한 표준 대로 url()
함수 구문 없이 이미지 주소를 적을 수 있고, dppx
, dpi
, dpcm
단위도 지원하며, type(image/avif)
등의 새로운 이미지 형식도 지원할 예정이다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Chrome 113은 2023년 4월 26일에 정식 배포 예정이다. 4월 6일부터 13일 사이에 크롬 베타 버전에서 해당 기능을 미리 확인해 볼 수 있다.
WebAssembly.Module()
의 크기 제한 지원 중단new WebAssembly.Module(bytes)
는 Web Assembly 바이트 코드를 모듈로 파싱한다.
fetch('example.wasm')
.then((response) => response.arrayBuffer())
.then((bytes) => {
const m = new WebAssembly.Module(bytes);
WebAssembly.instantiate(m, importObject).then((result) => result.exports.exported_func());
});
이 동작은 동기로 이루어진다. 모듈의 크기가 너무 크면 메인 스레드를 너무 오래 점유할 수 있어 기존에는 WebAssembly.Module()
로 파싱할 수 있는 모듈의 크기를 4KB로 제한했다.
차세대 V8 엔진에 힘입어 Chrome 114부터는 이 제한을 없앨 예정이다. 통계상 가장 큰 모듈을, 가장 성능이 낮은 기기에서 파싱했을 때 최대 1초를 넘기지 않았다고 한다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
CSS Level 4에서 추가된 text-wrap
과 white-space-collapse
속성을 추가한다. 이 둘은 white-space
속성을 쪼갠 것으로, white-space
속성은 이 둘의 축약 문법이 된다. white-space-collapse
는 기존의 white-space
처럼 빈 공간 활용을 정의하는 속성이며, text-wrap
은 공간에 글자를 어떻게 배치할지에 관한 속성이다.
그 중에서도 text-wrap: balance
기존에 없던 배치 알고리즘이다. text-wrap: balance
를 적용하면 브라우저가 해당 언어, 국가를 고려해 가장 균형 잡힌 형태로 줄바꿈을 맞춰 준다.
(출처: CSS text-wrap: balance)
text-wrap: wrap
을 적용했을 때와 비교해 단락의 총 줄 개수는 변하지 않는다. 이는 특히 글의 제목을 표현할 때 유용할 수 있어 Chrome 팀은 다음과 같이 적용하길 권장한다.
h1,
h2,
h3,
h4,
h5,
h6,
blockquote {
text-wrap: balance;
}
하지만 *
선택자를 사용해 모든 요소에 text-wrap: balance
를 적용하는 방법은 추천하지 않는다. text-wrap: balance
속성은 각 요소마다 브라우저에 별도의 요청을 보내기에 아직 성능 문제가 있을 수 있다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Popover는 웹 페이지 위에 덧씌우는 UI를 말한다. Date Picker, Context Menu, 간단한 툴팁 등, 웹 개발에서 Popover를 사용하는 예는 아주 많다. 하지만 상태 관리, 포커스 관리, 접근성 등 고려할 사항이 많아 은근히 구현이 쉽지 않은 기능 중 하나다.
Chrome 114에서 추가 예정인 HTML 요소의 popover
속성을 사용하면 이 Popover를 쉽게 구현할 수 있다.
<div popover>안녕하세요?</div>
popover
속성에 지정할 수 있는 값은 "auto" | "manual"
이며, 기본값은 "auto"
이다. 두 값의 차이는 다음과 같다.
"auto"
:
popover
요소를 숨긴다.popover
요소 바깥을 클릭하거나, escape 버튼을 누르는 성격의 동작 시 현재 popover
요소를 숨긴다."manual"
:
popover
요소를 숨기지 않는다.popover
요소는 기본적으로 position: fixed;
스타일을 가진다. <dialog>
처럼 ::backdrop
가상 선택자로 배경 요소에 접근할 수 있으며, :open
으로 화면에 나타난 popover
요소를, :closed
로 숨은 popover
요소를 선택할 수 있다.
[popover]::backdrop {
background-color: rgba(0, 0, 0, 0.6);
}
[popover]:open {
display: flex;
}
popovertarget
, popovertargetaction
속성을 사용하면 자바스크립트 없이도 popover
요소를 제어할 수 있다.
<span id="myPopover" popover>안녕하세요?</span>
<button type="button" popovertarget="myPopover">
이 버튼을 누르면 메시지가 나타나거나 사라집니다.
</button>
<button type="button" popovertarget="myPopover" popovertargetaction="show">
이 버튼을 누르면 메시지가 나타납니다.
</button>
<button type="button" popovertarget="myPopover" popovertargetaction="hide">
이 버튼을 누르면 메시지가 사라집니다.
</button>
<button type="button" popovertarget="myPopover" popovertargetaction="toggle">
이 버튼을 누르면 메시지가 나타나거나 사라집니다.
</button>
또는 자바스크립트를 통해 직접 popover
요소의 상태를 제어할 수도 있다.
const popover = document.getElementById('myPopover');
popover.showPopover();
console.log(popover.matches(':open')); // true
popover.hidePopover();
console.log(popover.matches(':open')); // false
popover.togglePopover();
console.log(popover.matches(':open')); // true
popover
속성은 <dialog>
에 비해 좀 더 범용적이다. HTML 태그가 아닌 속성이기 때문에 시맨틱(sementic) 웹을 구축하기 좋으며, 순수하게 CSS로 애니메이션을 구현할 수도 있고, <dialog>
에 open
이벤트가 없는 것과 달리 화면에 나타날 때도 이벤트(beforetoggle
)를 발생시킨다.
다만 popover
는 브라우저가 직접 display
스타일을 조작해 상태를 제어하므로 애니메이션을 구현할 때 주의해야 한다. display
속성에 관한 애니메이션 및 transition
지원이 Chrome 114에 같이 배포될 예정이니 참고하자.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
display
, content-visibility
의 애니메이션 사용 지원display
속성 및 content-visibility
속성을 CSS 애니메이션에서 사용할 수 있도록 변경한다.
@keyframes slideOut {
from {
display: block;
}
to {
transform: translateX(40px);
opacity: 0;
}
}
.hide {
animation: slideOut 0.2s;
display: none;
}
위 예시에서 hide
클래스를 지정한 요소는 애니메이션 없이 바로 화면에서 사라진다. display
속성은 opacity
등의 속성과 달리 중간 값을 연산할 수 없는 불연속(discrete
) 속성이다. 애니메이션에서 display
속성 자체를 지원하지 않아 display: block;
구문을 무시한 것이다.
Chrome 114부터는 display
및 content-visibility
속성의 중간 값을 none | hidden
이 아닌 특정 값으로 연산해 해당 속성의 애니메이션 사용을 지원할 예정이다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
CSS 불연속(discrete
) 속성이란 중간 값을 연산할 수 없는 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 114부터는 transition-property
속성에 불연속 속성을 명시해 transition
의 대상으로 지정할 수 있다.
.hide {
transition: opacity 0.3s, display 0.3s;
opacity: 0;
display: none;
}
const target = document.querySelector('#target');
target.classList.add('.hide');
주의해야 할 점은 all
은 여전히 불연속 속성을 포함하지 않는다는 점이다. 불연속 속성을 transition
의 대상으로 지정하려면 해당 속성을 명시적으로 transition-property
에 작성해야 한다.
/* 애니메이션 없이 바로 사라진다. */
.hide {
transition: all 0.3s;
opacity: 0;
display: none;
}
/* 0.3초 후 사라진다. */
.hide {
transition: display 0.3s, opacity 0.3s;
opacity: 0;
display: none;
}
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
zoom
속성 지원 중단 미리 보기 📌비표준 CSS 속성인 zoom
의 지원 중단 미리 보기가 추가될 예정이다.
zoom
은 요소 크기 배율을 지정하는 CSS 속성이다. transform: scale()
과 유사하나, zoom
은 실제 레이아웃에 영향을 미치며, 애니메이션을 지원하지 않는다는 점이 다르다.
정식 지원 중단 일정은 불투명하나, zoom
을 사용하는 페이지가 있다면 표준 속성인 transform
으로의 전환을 고려해야 한다. 아직 이 속성을 사용하는 페이지는 전체 페이지의 약 0.5% 정도라고 한다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
Chrome 114은 2023년 5월 24일에 정식 배포 예정이다. 5월 3일부터 11일 사이에 크롬 베타 버전에서 해당 기능을 미리 확인해 볼 수 있다.
RTCPeerConnection.getStats()
콜백 방식 지원 중단 📌Chrome 113의 [✅ RTCPeerConnection.getStats()
콜백 방식 지원 중단 미리 보기 📌]를 정식 적용한다.
shadowroot
속성 지원 중단선언적 Shadow DOM은 <template>
요소에 shadowroot
속성을 지정해 템플릿에서 직접 Shadow DOM을 활성화할 수 있는 기능이다. 표준에서 이 속성에 대한 이름을 shadowrootmode
로 변경함에 따라 기존 shadowroot
속성을 지원 중단한다. shadowroot
는 크롬에서 그대로 동작하나, 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://flags
에서 해당 기능을 활성화해 속성 지원 중단을 미리 체험할 수 있다.
이 항목에 대한 주요 브라우저 및 웹 개발자의 의견은 다음과 같다.
shadowroot
attribute for declarative shadow DOM (Deprecated)내부망 접근 규칙(Local Network Access) 적용의 일부로 하위 리소스(.js
, .css
등)를 요청할 때 내부망(사설 IP, localhost)에 대한 접근 제한을 검토 중이다. 정식 적용 일정은 불투명하나, 미리 보기로 일부 기능을 체험할 수 있다.
공개 웹 사이트(공개 IP로 접근 가능한 사이트)에서 내부망에 하위 리소스(.js
, .css
등) 요청 시 반드시 보안 컨텍스트(HTTPS)를 사용하도록 제한한다. 내부망의 하위 리소스에 접근하려면 보안 컨텍스트를 사용하도록 변경해야 한다.
Chrome 86 이상의 chrome://flags
에서 해당 기능을 활성화해 접근 제한을 미리 체험할 수 있다.
내부망에 하위 리소스 요청 시 사전 요청을 보내 연결 허용 여부를 먼저 묻는다. 현재는 사전 요청 실패 시 개발자 콘솔에 경고만 노출한다.