React Trusted Types 지원

React Trusted Types support

정책이 만든 신뢰 객체를 문자열로 바꾸지 않고 DOM에 전달합니다.

···
html
<div class="scene"><div class="source"><span id="source">raw HTML string</span><b id="kind">STRING</b></div><div class="flow"><span class="path">INPUT</span><span class="gate" id="gate">POLICY GATE</span><span class="path">DOM</span></div><div class="result" id="result">blocked by CSP</div><div class="note">Conceptual flow: policy + CSP required</div></div>
css
.scene{width:min(94vw,800px);height:min(86vh,320px);position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:clamp(9px,2.4vmin,20px);font:500 clamp(15px,4vmin,18px)/1.3 var(--font-sans,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif)}.scene b,.scene strong{font-weight:700}.label{color:var(--muted)}.code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.pill{border:1px solid var(--line);border-radius:8px;padding:.4em .65em;background:var(--bg)}.active{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 10%,var(--surface))!important}.source,.flow,.result{display:flex;align-items:center;justify-content:space-between;gap:7px}.source{border:1px solid var(--line);border-radius:8px;padding:.55em;font-size:clamp(13px,3.7vmin,17px)}.source b{font:700 clamp(12px,3vmin,14px) ui-monospace,monospace;color:var(--accent-3)}.flow{flex:1;min-height:60px}.path{font:700 clamp(12px,3vmin,14px) ui-monospace,monospace}.gate{border:2px solid var(--accent-3);border-radius:8px;padding:.5em;text-align:center;font:700 clamp(12px,3vmin,14px) ui-monospace,monospace;transition:border-color .3s,background .3s}.gate.pass{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 15%,var(--surface))}.result{justify-content:center;border-radius:8px;padding:.45em;background:color-mix(in srgb,var(--accent-3) 16%,var(--surface));color:var(--accent-3);font-weight:700}.result.pass{background:color-mix(in srgb,var(--accent) 16%,var(--surface));color:var(--accent)}.note{font-size:clamp(12px,3vmin,14px);color:var(--muted);text-align:center}
js
let trusted=false;function tick(){trusted=!trusted;document.getElementById("source").textContent=trusted?"policy-created HTML":"raw HTML string";document.getElementById("kind").textContent=trusted?"TRUSTED":"STRING";document.getElementById("kind").style.color=trusted?"var(--accent)":"var(--accent-3)";document.getElementById("gate").classList.toggle("pass",trusted);document.getElementById("result").classList.toggle("pass",trusted);document.getElementById("result").textContent=trusted?"accepted by DOM":"blocked by CSP"}tick();setInterval(tick,1400)

React 19.3은 TrustedHTML 같은 Trusted Types 객체를 DOM API에 전달할 때 문자열로 강제 변환하지 않습니다. Trusted Types를 요구하는 CSP를 적용한 페이지에서 브라우저가 정책을 거친 객체와 일반 문자열을 구별할 수 있습니다.

데모는 일반 문자열이 게이트에서 멈추고 정책이 만든 객체만 DOM 경로로 들어가는 흐름을 모형으로 보여줍니다. 정책이 실제로 안전한 입력만 만들도록 검증하는 일과 CSP 설정은 별도로 필요합니다.

언제 쓰나

Trusted Types CSP가 있는 React 앱에서 검증된 HTML을 DOM에 전달할 때 확인합니다.

페이지로 열기 ↗