COEP를 사용하는 개발자는 이제 COEP 자체를 사용하지 않는 서드 파티 iframe을 삽입할 수 있습니다.
사용자 인증 정보 없는 iframe은 Chrome 버전 110부터 기본적으로 사용 설정됩니다. 이 API는 Cross-Origin-Embedder-Policy (COEP)를 사용하는 개발자가 COEP를 설정하지 않은 서드 파티 iframe을 삽입하는 것과 같은 가장 일반적인 불만사항을 해결합니다.
COEP가 필요한 이유
일부 웹 API는 Spectre와 같은 부채널 공격의 위험을 높입니다. 이러한 위험을 완화하기 위해 브라우저는 COEP를 배포해야 하는 교차 출처 격리라는 선택 기반의 격리 환경을 제공합니다. 교차 출처 분리를 사용하면 웹사이트에서 SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
, 해상도가 더 높은 고정밀 타이머를 비롯한 권한 있는 기능을 사용할 수 있습니다.
교차 출처 분리를 사용 설정하려면 웹사이트에서 다음 HTTP 헤더를 전송해야 합니다.
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
COEP:credentialless를 require-corp
대신 사용할 수도 있습니다. 자세한 내용은 문서를 참고하세요.
COEP 사용 시의 과제
교차 출처 격리는 웹페이지의 보안과 강력한 기능을 지원하는 기능을 제공하지만 COEP를 배포하는 것은 어려울 수 있습니다. 가장 큰 과제 중 하나는 모든 교차 출처 iframe이 COEP 및 CORP를 배포해야 한다는 점입니다. 이러한 헤더가 없는 Iframe은 브라우저에 의해 로드되지 않습니다.
사용자 인증 정보가 없는 iframe
COEP를 설정하지 않은 서드 파티 iframe을 삽입할 수 있도록 <iframe credentialless>
가 도입됩니다. credentialless
속성을 <iframe>
요소에 추가하면 iframe이 다른 빈 컨텍스트에서 로드됩니다. 특히 쿠키 없이 로드됩니다. 이를 통해 COEP 제한을 제거할 수 있습니다.
예:
<iframe credentialless src="https://example.com">
이 iframe은 새로운 임시 컨텍스트에서 생성되며 최상위 웹사이트와 연결된 쿠키에는 액세스할 수 없습니다. 대신 빈 쿠키 단지로 시작합니다. 마찬가지로 LocalStorage, CacheStorage, IndexedDB 등의 스토리지 API는 새 임시 파티션에 데이터를 로드하고 저장합니다. 파티션의 범위가 현재 최상위 문서 및 iframe 원본 모두로 지정됩니다. 최상위 문서가 언로드되면 이러한 저장공간이 모두 지워집니다.
사용자 인증 정보가 없는 iframe에는 COEP 삽입 규칙이 적용되지 않습니다. 여전히 안전합니다. 항상 새로운 빈 컨텍스트에서 로드되기 때문에 개인화된 데이터를 포함해서는 안 됩니다. 공격자가 노리는 목표입니다. iframe에 공개 데이터만 포함되어 있으면 공격자가 가치가 없습니다.
데모
사용자 인증 정보가 없는 iframe 데모를 확인하세요.
FAQ
다른 브라우저에서도 이 기능을 사용할 수 있나요?
<iframe>
가 사용자 인증 정보가 없는 <iframe credentialless>
내에 중첩되어 있나요?
예. 상속됩니다. 사용자 인증 정보가 없는 iframe은 credentialless
속성이 없어도 전체 하위 트리에 있는 모든 iframe에 적용됩니다.
<iframe credentialless>
에서 생성된 팝업도 사용자 인증 정보가 없나요?
noopener
가 설정된 것처럼 팝업이 열립니다. 새로운 일반 최상위 컨텍스트에서 생성되며 사용자 인증 정보가 없습니다. 사용자 인증 정보가 없는 iframe과 통신할 수 없습니다.
문서가 사용자 인증 정보가 없는 iframe에 삽입되었는지 어떻게 감지하나요?
window.credentialless
는 사용자 인증 정보가 없는 iframe 내부에서는 true이고 그렇지 않으면 false입니다. 이 값은 <iframe credentialless>
을 지원하지 않는 웹브라우저에서 undefined
입니다.