Trusted Types APIμ λν μ’ ν© κ°μ΄λ. μ΅μ μΉ μ ν리μΌμ΄μ μμ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) 곡격μ λ°©μ§νκ³ μμ ν DOM μ‘°μμ μ΄μ§νλ μν μ νꡬν©λλ€.
Trusted Types API: μμ ν DOM μ‘°μμ ν΅ν 보μ κ°ν
μΉ μ·¨μ½μ κ³Όμ λμμλ μΈμμμ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) 곡격μ μ¬μ ν μ§μμ μΈ μνμΌλ‘ λ¨μμμ΅λλ€. μ΄λ¬ν 곡격μ μΉ μ ν리μΌμ΄μ μ μ·¨μ½μ μ μ΄μ©νμ¬ μ λ’°ν μ μλ μΉμ¬μ΄νΈμ μ μ± μ€ν¬λ¦½νΈλ₯Ό μ£Όμ νμ¬ κ³΅κ²©μκ° λ―Όκ°ν λ°μ΄ν°λ₯Ό νμΉκ±°λ, μΉμ¬μ΄νΈλ₯Ό νΌμνκ±°λ, μ¬μ©μλ₯Ό μ μ± μ¬μ΄νΈλ‘ 리λλ μ ν μ μλλ‘ ν©λλ€. μ΄μ λμνκΈ° μν΄ Trusted Types APIλ κ°λ ₯ν λ°©μ΄ λ©μ»€λμ¦μΌλ‘ λ±μ₯νμ¬ μμ ν DOM μ‘°μμ μ΄μ§νκ³ XSS μ·¨μ½μ μ μνμ ν¬κ² μ€μ¬μ€λλ€.
ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS)μ μ΄ν΄
XSS 곡격μ μ¬μ©μ μ 곡 λ°μ΄ν°κ° μ μ ν μ μ (sanitization)λ μΈμ½λ© μμ΄ μΉ νμ΄μ§μ μΆλ ₯μ λΆμ μ νκ² ν΅ν©λ λ λ°μν©λλ€. XSSμλ μΈ κ°μ§ μ£Όμ μ νμ΄ μμ΅λλ€:
- μ μ₯ν XSS(Stored XSS): μ μ± μ€ν¬λ¦½νΈκ° λμ μλ²(μ: λ°μ΄ν°λ² μ΄μ€, ν¬λΌ κ²μλ¬Ό, λκΈ μΉμ )μ μꡬμ μΌλ‘ μ μ₯λ©λλ€. λ€λ₯Έ μ¬μ©μκ° μ μ₯λ λ°μ΄ν°μ μ κ·Όνλ©΄ μ€ν¬λ¦½νΈκ° κ·Έλ€μ λΈλΌμ°μ μμ μ€νλ©λλ€.
- λ°μ¬ν XSS(Reflected XSS): μ μ± μ€ν¬λ¦½νΈκ° URLμ΄λ μμ μ μΆμ ν¬ν¨λμ΄ μλ΅μμ μ¬μ©μμκ² μ¦μ λ€μ λ°μ¬λ©λλ€. μ΄λ λ³΄ν΅ μ¬μ©μλ₯Ό μμ¬ μ μ± λ§ν¬λ₯Ό ν΄λ¦νλλ‘ μ λνλ λ°©μμ ν¬ν¨ν©λλ€.
- DOM κΈ°λ° XSS(DOM-based XSS): μ μ± μ€ν¬λ¦½νΈκ° μλ² μΈ‘ λ°μ΄ν° μ μ₯μ΄λ λ°μ¬μ μμ‘΄νλ λμ ν΄λΌμ΄μΈνΈ μΈ‘ μλ°μ€ν¬λ¦½νΈ μ½λ μ체μ μ·¨μ½μ μ μ΄μ©ν©λλ€. μ΄λ μ’ μ’ λ¬Έμ κ°μ²΄ λͺ¨λΈ(DOM)μ μ§μ μ‘°μνλ κ²μ ν¬ν¨ν©λλ€.
μ ν΅μ μΌλ‘ κ°λ°μλ€μ XSS 곡격μ λ§κΈ° μν΄ μ λ ₯ μ ν¨μ± κ²μ¬μ μΆλ ₯ μΈμ½λ©μ μμ‘΄ν΄μμ΅λλ€. μ΄λ¬ν κΈ°μ μ νμμ μ΄μ§λ§, μ¬λ°λ₯΄κ² ꡬννκΈ° 볡μ‘νκ³ μ’ μ’ μ€λ₯κ° λ°μνκΈ° μ½μ΅λλ€. Trusted Types APIλ DOM μμ€μμ μμ ν μ½λ© κ΄νμ κ°μ ν¨μΌλ‘μ¨ λ κ°λ ₯νκ³ κ°λ°μ μΉνμ μΈ μ κ·Ό λ°©μμ μ 곡ν©λλ€.
Trusted Types API μκ°
μΉ νλ«νΌ 보μ κΈ°λ₯μΈ Trusted Types APIλ μ μ¬μ μΌλ‘ μνν DOM μ‘°μ λ©μλμ μ¬μ©μ μ ννμ¬ κ°λ°μκ° λ μμ ν μΉ μ ν리μΌμ΄μ μ μμ±νλλ‘ λμ΅λλ€. μ΄λ DOM XSS μ±ν¬(μ€ν¬λ¦½νΈ μ£Όμ μ΄ λ°μν μ μλ μμΉ)κ° λͺ μμ μΌλ‘ μ μ λκ³ "Trusted Type"μΌλ‘ λνλ κ°λ§ νμ©ν΄μΌ νλ€λ κ·μΉμ κ°μ ν©λλ€. μ΄λ κΈ°λ³Έμ μΌλ‘ DOMμ μ‘°μνλ λ° μ¬μ©λλ λ¬Έμμ΄μ λν νμ μμ€ν μ μμ±νμ¬, μ λ’°ν μ μλ λ°μ΄ν°κ° μ΄λ¬ν μ±ν¬μ μ§μ μ λ¬λ μ μλλ‘ ν©λλ€.
μ£Όμ κ°λ :
- DOM XSS μ±ν¬: νμ΄μ§μ μ€ν¬λ¦½νΈλ₯Ό μ£Όμ
νλ λ° κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ μμ± λ° λ©μλμ
λλ€. μλ‘λ
innerHTML
,outerHTML
,src
,href
,document.write
κ° μμ΅λλ€. - Trusted Types: λ¬Έμμ΄μ΄ μ μ€νκ² κ²ν λμμΌλ©° DOM XSS μ±ν¬μμ μ¬μ©νκΈ°μ μμ νλ€λ κ²μ λνλ΄λ νΉμ λνΌ κ°μ²΄μ
λλ€. μ΄ APIλ
TrustedHTML
,TrustedScript
,TrustedScriptURL
κ³Ό κ°μ μ¬λ¬ λ΄μ₯ Trusted Typeμ μ 곡ν©λλ€. - νμ μ μ± (Type Policies): Trusted Typeμ μμ±νκ³ μ¬μ©νλ λ°©λ²μ μ μνλ κ·μΉμ λλ€. μ΄λ€ ν¨μκ° Trusted Typeμ μμ±ν μ μλμ§, κ·Έλ¦¬κ³ κΈ°λ³Έ λ¬Έμμ΄μ μ΄λ»κ² μ μ νκ±°λ μ ν¨μ±μ κ²μ¬νλμ§λ₯Ό μ§μ ν©λλ€.
Trusted Typesμ μλ λ°©μ
Trusted Typesμ ν΅μ¬ μμΉμ κ°λ°μκ° μ λ’°ν μ μλ λ¬Έμμ΄μ DOM XSS μ±ν¬μ μ§μ μ λ¬νλ κ²μ λ°©μ§νλ κ²μ
λλ€. Trusted Typesκ° νμ±νλλ©΄, Trusted Typeμ΄ μμλλ κ³³μ μΌλ° λ¬Έμμ΄μ΄ μ¬μ©λ κ²½μ° λΈλΌμ°μ λ TypeError
λ₯Ό λ°μμν΅λλ€.
Trusted Typesλ₯Ό μ¬μ©νλ €λ©΄ λ¨Όμ νμ μ μ± μ μ μν΄μΌ ν©λλ€. νμ μ μ± μ Trusted Typeμ μμ±νλ λ°©λ²μ μ§μ νλ μλ°μ€ν¬λ¦½νΈ κ°μ²΄μ λλ€. μλ₯Ό λ€μ΄:
if (window.trustedTypes && window.trustedTypes.createPolicy) {
window.myPolicy = trustedTypes.createPolicy('myPolicy', {
createHTML: function(input) {
// μ¬κΈ°μ μ
λ ₯μ μ μ ν©λλ€. μ΄κ²μ νλ μ΄μ€νλμ΄λ©°, μ€μ μ μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμΈμ.
let sanitized = DOMPurify.sanitize(input); // DOMPurifyλ₯Ό μ¬μ©ν μμ
return sanitized;
},
createScriptURL: function(input) {
// μ¬κΈ°μ μ
λ ₯μ μ ν¨μ±μ κ²μ¬νμ¬ μμ ν URLμΈμ§ νμΈν©λλ€.
if (input.startsWith('https://example.com/')) {
return input;
} else {
throw new Error('μ λ’°ν μ μλ URL: ' + input);
}
},
createScript: function(input) {
// μ€ν¬λ¦½νΈ μμ± μ λ§€μ° μ£Όμν΄μΌ νλ©°, μμ μ΄ λ¬΄μμ νλμ§ μ λλ§ μ¬μ©νμΈμ
return input;
}
});
}
μ΄ μμ μμλ "myPolicy"λΌλ μ΄λ¦μ νμ
μ μ±
μ createHTML
, createScriptURL
, createScript
μΈ κ°μ§ ν¨μλ‘ μμ±ν©λλ€. createHTML
ν¨μλ DOMPurifyμ κ°μ μ μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ
λ ₯ λ¬Έμμ΄μ μ μ ν©λλ€. createScriptURL
ν¨μλ μ
λ ₯μ΄ μμ ν URLμΈμ§ νμΈνκΈ° μν΄ μ ν¨μ±μ κ²μ¬ν©λλ€. createScript
ν¨μλ μμμ μ€ν¬λ¦½νΈ μ€νμ νμ©νλ―λ‘, κ°λ₯νλ©΄ νΌνλ κ²μ΄ μ΄μμ μ΄λ©° κ·Ήλμ μ£Όμλ₯Ό κΈ°μΈμ¬ μ¬μ©ν΄μΌ ν©λλ€.
νμ μ μ± μ΄ μμ±λλ©΄ μ΄λ₯Ό μ¬μ©νμ¬ Trusted Typeμ λ§λ€ μ μμ΅λλ€:
let untrustedHTML = '
';
let trustedHTML = myPolicy.createHTML(untrustedHTML);
document.getElementById('myElement').innerHTML = trustedHTML;
μ΄ μμ μμλ μ λ’°ν μ μλ HTML λ¬Έμμ΄μ μ°λ¦¬ νμ
μ μ±
μ createHTML
ν¨μμ μ λ¬ν©λλ€. μ΄ ν¨μλ λ¬Έμμ΄μ μ μ νκ³ TrustedHTML
κ°μ²΄λ₯Ό λ°νν©λλ€. κ·Έλ° λ€μ μ΄ TrustedHTML
κ°μ²΄λ₯Ό XSS 곡격 μν μμ΄ μμμ innerHTML
μμ±μ μμ νκ² ν λΉν μ μμ΅λλ€.
Trusted Types μ¬μ©μ μ΄μ
- 보μ κ°ν: Trusted Typesλ κ°λ°μκ° μ λ’°ν μ μλ λ¬Έμμ΄μ DOM XSS μ±ν¬μ μ§μ μ λ¬νλ κ²μ λ°©μ§νμ¬ XSS 곡격μ μνμ ν¬κ² μ€μ λλ€.
- μ½λ νμ§ ν₯μ: Trusted Typesλ κ°λ°μκ° λ°μ΄ν° μ μ λ° μ ν¨μ± κ²μ¬μ λν΄ λ μ μ€νκ² μκ°νλλ‘ μ₯λ €νμ¬ μ½λ νμ§κ³Ό 보μ κ΄νμ κ°μ ν©λλ€.
- 보μ κ²ν κ°μν: Trusted Typesλ νμ μ μ± μ μν΄ DOM XSS μ±ν¬μ μ¬μ©μ΄ λͺ μμ μΌλ‘ μ μ΄λλ―λ‘ μ½λμμ μ μ¬μ μΈ XSS μ·¨μ½μ μ μλ³νκ³ κ²ν νκΈ°κ° λ μ¬μμ§λλ€.
- CSPμμ νΈνμ±: Trusted Typesλ μ½ν μΈ λ³΄μ μ μ± (CSP)κ³Ό ν¨κ» μ¬μ©νμ¬ μΉ μ ν리μΌμ΄μ 보μμ λμ± κ°νν μ μμ΅λλ€.
ꡬν μ κ³ λ €μ¬ν
Trusted Typesλ₯Ό ꡬννλ €λ©΄ μ μ€ν κ³νκ³Ό μ€νμ΄ νμν©λλ€. λ€μμ λͺ κ°μ§ μ€μν κ³ λ €μ¬νμ λλ€:
- DOM XSS μ±ν¬ μλ³: 첫 λ²μ§Έ λ¨κ³λ μ ν리μΌμ΄μ μ λͺ¨λ DOM XSS μ±ν¬λ₯Ό μλ³νλ κ²μ λλ€. μ΄κ²λ€μ DOMμ μ‘°μνλ λ° μ¬μ©λλ©° XSS 곡격μ μν΄ μ μ©λ μ μλ μμ±κ³Ό λ©μλμ λλ€.
- μ μ λΌμ΄λΈλ¬λ¦¬ μ ν: Trusted Typeμ μμ±νκΈ° μ μ μ λ’°ν μ μλ λ°μ΄ν°λ₯Ό μ μ νκΈ° μν΄ ννμ΄ μ’κ³ μ κ΄λ¦¬λλ μ μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ ννμΈμ. DOMPurifyλ λ리 μ¬μ©λλ ν¨κ³Όμ μΈ μ νμ λλ€. νΉμ μꡬμ λ§κ² μ¬λ°λ₯΄κ² ꡬμ±ν΄μΌ ν©λλ€.
- νμ μ μ± μ μ: Trusted Typeμ μμ±νκ³ μ¬μ©νλ λ°©λ²μ μ§μ νλ νμ μ μ± μ λ§λμΈμ. XSS 곡격μ ν¨κ³Όμ μΌλ‘ λ°©μ§ν μ μλλ‘ νμ μ μ± μ μ μ λ° μ ν¨μ± κ²μ¬ λ‘μ§μ μ μ€νκ² κ³ λ €ν΄μΌ ν©λλ€.
- μ½λ μ λ°μ΄νΈ: μ μ¬μ μΌλ‘ μ λ’°ν μ μλ λ°μ΄ν°λ‘ DOMμ μ‘°μν λλ§λ€ Trusted Typesλ₯Ό μ¬μ©νλλ‘ μ½λλ₯Ό μ λ°μ΄νΈνμΈμ. DOM XSS μ±ν¬μ λν μ§μ ν λΉμ Trusted Type ν λΉμΌλ‘ κ΅μ²΄νμΈμ.
- μ² μ ν ν μ€νΈ: Trusted Typesλ₯Ό ꡬνν ν μ ν리μΌμ΄μ μ΄ μ¬λ°λ₯΄κ² μλνκ³ νκ· λ¬Έμ κ° μλμ§ μ² μ ν ν μ€νΈνμΈμ. νΉν DOMμ μ‘°μνλ μμμ μ£Όμλ₯Ό κΈ°μΈμ΄μΈμ.
- λ§μ΄κ·Έλ μ΄μ μ λ΅: ν¬κ³ κΈ°μ‘΄μ μ½λλ² μ΄μ€μ Trusted Typesλ₯Ό ꡬννλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. μ ν리μΌμ΄μ μ κ°μ₯ μ€μν μμλΆν° μμνμ¬ μ μ§μ μΈ λ§μ΄κ·Έλ μ΄μ μ λ΅μ κ³ λ €νμΈμ. μ²μμλ "λ³΄κ³ μ μ©(report-only)" λͺ¨λλ‘ Trusted Typesλ₯Ό νμ±ννμ¬ μ ν리μΌμ΄μ μ μ€λ¨μν€μ§ μκ³ μλ° μ¬νμ μλ³ν μ μμ΅λλ€.
μμ μλ리μ€
Trusted Typesκ° λ€μν μλ리μ€μμ μ΄λ»κ² μ¬μ©λ μ μλμ§ λͺ κ°μ§ μ€μ μ μΈ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
μλλ¦¬μ€ 1: μ¬μ©μ μμ± μ½ν μΈ νμ
μΉμ¬μ΄νΈμμ μ¬μ©μκ° λκΈκ³Ό κ²μλ¬Όμ μ μΆν μ μλλ‘ νμ©ν©λλ€. Trusted Typesκ° μμΌλ©΄ μ΄ μ½ν μΈ λ₯Ό νμνλ κ²μ΄ XSS 곡격μ μ·¨μ½ν μ μμ΅λλ€. Trusted Typesλ₯Ό μ¬μ©νλ©΄ μ¬μ©μ μμ± μ½ν μΈ λ₯Ό νμνκΈ° μ μ μ μ νμ¬ μ μ± μ€ν¬λ¦½νΈκ° μ κ±°λλλ‘ ν μ μμ΅λλ€.
// Trusted Types μ¬μ© μ :
// document.getElementById('comments').innerHTML = userComment; // XSSμ μ·¨μ½ν¨
// Trusted Types μ¬μ© ν:
let trustedHTML = myPolicy.createHTML(userComment);
document.getElementById('comments').innerHTML = trustedHTML;
μλλ¦¬μ€ 2: μΈλΆ μλ°μ€ν¬λ¦½νΈ νμΌ λ‘λ©
μΉμ¬μ΄νΈκ° μΈλΆ μμ€μμ μλ°μ€ν¬λ¦½νΈ νμΌμ λμ μΌλ‘ λ‘λν©λλ€. Trusted Typesκ° μμΌλ©΄ μ μμ μΈ κ³΅κ²©μκ° μ΄λ¬ν νμΌ μ€ νλλ₯Ό μμ μ μ μ± μ€ν¬λ¦½νΈλ‘ κ΅μ²΄ν μ μμ΅λλ€. Trusted Typesλ₯Ό μ¬μ©νλ©΄ μ€ν¬λ¦½νΈ νμΌμ λ‘λνκΈ° μ μ URLμ μ ν¨μ±μ κ²μ¬νμ¬ μ λ’°ν μ μλ μμ€μμ μ¨ κ²μΈμ§ νμΈν μ μμ΅λλ€.
// Trusted Types μ¬μ© μ :
// let script = document.createElement('script');
// script.src = untrustedURL; // XSSμ μ·¨μ½ν¨
// document.head.appendChild(script);
// Trusted Types μ¬μ© ν:
let trustedScriptURL = myPolicy.createScriptURL(untrustedURL);
let script = document.createElement('script');
script.src = trustedScriptURL;
document.head.appendChild(script);
μλλ¦¬μ€ 3: μμ μμ± μ€μ
μΉμ¬μ΄νΈκ° μ¬μ©μ μ λ ₯μ κΈ°λ°μΌλ‘ DOM μμμ μμ±μ μ€μ ν©λλ€. μλ₯Ό λ€μ΄, μ΅μ»€ νκ·Έμ `href` μμ±μ μ€μ νλ κ²½μ°μ λλ€. Trusted Typesκ° μμΌλ©΄ μ μμ μΈ κ³΅κ²©μκ° μλ°μ€ν¬λ¦½νΈ URIλ₯Ό μ£Όμ νμ¬ XSSλ‘ μ΄μ΄μ§ μ μμ΅λλ€. Trusted Typesλ₯Ό μ¬μ©νλ©΄ μμ±μ μ€μ νκΈ° μ μ URLμ μ ν¨μ±μ κ²μ¬ν μ μμ΅λλ€.
// Trusted Types μ¬μ© μ :
// anchorElement.href = userInputURL; // XSSμ μ·¨μ½ν¨
// Trusted Types μ¬μ© ν:
let trustedURL = myPolicy.createScriptURL(userInputURL);
anchorElement.href = trustedURL;
Trusted Typesμ μ½ν μΈ λ³΄μ μ μ± (CSP)
Trusted Typesλ XSS 곡격μ λν μ¬μΈ΅ λ°©μ΄λ₯Ό μ 곡νκΈ° μν΄ μ½ν μΈ λ³΄μ μ μ± (CSP)κ³Ό μ μ°λλ©λλ€. CSPλ μΉμ¬μ΄νΈμ λ‘λν μ μλ μ½ν μΈ μμ€λ₯Ό μ§μ ν μ μκ² ν΄μ£Όλ 보μ λ©μ»€λμ¦μ λλ€. Trusted Typesμ CSPλ₯Ό κ²°ν©νλ©΄ λ§€μ° μμ ν μΉ μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.
CSPμμ Trusted Typesλ₯Ό νμ±ννλ €λ©΄ require-trusted-types-for
μ§μλ¬Έμ μ¬μ©ν μ μμ΅λλ€. μ΄ μ§μλ¬Έμ λͺ¨λ DOM XSS μ±ν¬μ λν΄ Trusted Typesκ° νμν¨μ μ§μ ν©λλ€. μλ₯Ό λ€μ΄:
Content-Security-Policy: require-trusted-types-for 'script'; trusted-types myPolicy;
μ΄ CSP ν€λλ λΈλΌμ°μ μκ² λͺ¨λ μ€ν¬λ¦½νΈ μ€νμ λν΄ Trusted Typesλ₯Ό μꡬνκ³ "myPolicy" νμ μ μ± μ μν΄ μμ±λ Trusted Typesλ§ νμ©νλλ‘ μ§μν©λλ€.
λΈλΌμ°μ μ§μ λ° ν΄λ¦¬ν
Trusted Typesμ λν λΈλΌμ°μ μ§μμ μ¦κ°νκ³ μμ§λ§ μμ§ λ³΄νΈμ μΌλ‘ μ¬μ© κ°λ₯νμ§λ μμ΅λλ€. 2024λ νλ° κΈ°μ€μΌλ‘ ν¬λ‘¬, νμ΄μ΄νμ€, μ£μ§μ κ°μ μ£Όμ λΈλΌμ°μ μμλ μ μ§μλ©λλ€. μ¬ν리 μ§μμ λ€μ²μ Έ μμ΅λλ€. μ΅μ λΈλΌμ°μ νΈνμ± μ 보λ CanIUse.comμμ νμΈνμΈμ.
Trusted Typesλ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μνμ§ μλ ꡬν λΈλΌμ°μ μ κ²½μ° ν΄λ¦¬ν(polyfill)μ μ¬μ©ν μ μμ΅λλ€. ν΄λ¦¬νμ ꡬν λΈλΌμ°μ μμ μλ‘μ΄ κΈ°λ₯μ κΈ°λ₯μ μ 곡νλ μλ°μ€ν¬λ¦½νΈ μ½λ μ‘°κ°μ λλ€. ꡬκΈμμ μ 곡νλ κ²κ³Ό κ°μ μ¬λ¬ Trusted Types ν΄λ¦¬νμ΄ μμ΅λλ€. κ·Έλ¬λ ν΄λ¦¬νμ λ€μ΄ν°λΈ μ§μκ³Ό λμΌν μμ€μ 보μμ μ 곡νμ§λ μμ΅λλ€. μ£Όλ‘ νΈνμ±μ λκ³ μΌλΆ μ¬μ©μκ° κ΅¬ν λΈλΌμ°μ λ₯Ό μ¬μ©νλλΌλ APIλ₯Ό μ¬μ©νκΈ° μμν μ μλλ‘ ν©λλ€.
λμ λ° κ³ λ €μ¬ν
Trusted Typesκ° μλΉν 보μ ν₯μμ μ 곡νμ§λ§, λμμ μΈ μ κ·Ό λ°©μκ³Ό μ΄κ²μ΄ μλ²½ν ν΄κ²°μ± μ΄ μλ μ μλ μλ리μ€λ₯Ό μΈμ νλ κ²μ΄ μ€μν©λλ€:
- νλ μμν¬ ν΅ν©: 리μ‘νΈ(React), μ΅κ·€λ¬(Angular), λ·°(Vue.js)μ κ°μ μ΅μ μλ°μ€ν¬λ¦½νΈ νλ μμν¬λ μ’ μ’ XSS μνμ μννλ λ°©μμΌλ‘ DOM μ‘°μμ μ²λ¦¬ν©λλ€. μ΄λ¬ν νλ μμν¬λ μΌλ°μ μΌλ‘ κΈ°λ³Έμ μΌλ‘ λ°μ΄ν°λ₯Ό μ΄μ€μΌμ΄ννκ³ μμ ν μ½λ© ν¨ν΄ μ¬μ©μ κΆμ₯ν©λλ€. κ·Έλ¬λ νλ μμν¬λ₯Ό μ¬μ©νλλΌλ νλ μμν¬μ λ΄μ₯ λ³΄νΈ κΈ°λ₯μ μ°ννκ±°λ dangerouslySetInnerHTML(리μ‘νΈ) λλ μ μ¬ν κΈ°λ₯μ μλͺ» μ¬μ©νλ©΄ XSS μ·¨μ½μ μ΄ λ°μν μ μμ΅λλ€.
- μ격ν μ λ ₯ μ ν¨μ± κ²μ¬ λ° μΆλ ₯ μΈμ½λ©: μ λ ₯ μ ν¨μ± κ²μ¬ λ° μΆλ ₯ μΈμ½λ©μ μ ν΅μ μΈ λ°©λ²μ μ¬μ ν μ€μν©λλ€. Trusted Typesλ μ΄λ¬ν κΈ°μ μ λ체νλ κ²μ΄ μλλΌ λ³΄μν©λλ€. μ λ ₯ μ ν¨μ± κ²μ¬λ μ ν리μΌμ΄μ μ λ€μ΄μ€λ λ°μ΄ν°κ° μ¬λ°λ₯Έ νμμ΄λ©° μμλλ νμμ μ€μνλμ§ νμΈν©λλ€. μΆλ ₯ μΈμ½λ©μ λ°μ΄ν°κ° νμ΄μ§μ νμλ λ μ μ νκ² μ΄μ€μΌμ΄νλμ΄ λΈλΌμ°μ κ° μ΄λ₯Ό μ½λλ‘ ν΄μνλ κ²μ λ°©μ§ν©λλ€.
- μ±λ₯ μ€λ²ν€λ: μΌλ°μ μΌλ‘ λ―Έλ―Ένμ§λ§ Trusted Typesμ νμν μ μ λ° μ ν¨μ± κ²μ¬ νλ‘μΈμ€μ κ΄λ ¨λ μ½κ°μ μ±λ₯ μ€λ²ν€λκ° μμ μ μμ΅λλ€. μ±λ₯ λ³λͺ© νμμ μλ³νκ³ κ·Έμ λ°λΌ μ΅μ ννκΈ° μν΄ μ ν리μΌμ΄μ μ νλ‘νμΌλ§νλ κ²μ΄ νμμ μ λλ€.
- μ μ§ κ΄λ¦¬ λΆλ΄: Trusted Typesλ₯Ό ꡬννκ³ μ μ§ κ΄λ¦¬νλ €λ©΄ μ ν리μΌμ΄μ μ DOM ꡬ쑰 λ° λ°μ΄ν° νλ¦μ λν νμ€ν μ΄ν΄κ° νμν©λλ€. νμ μ μ± μ μμ±νκ³ κ΄λ¦¬νλ κ²μ μ μ§ κ΄λ¦¬ λΆλ΄μ κ°μ€μν¬ μ μμ΅λλ€.
μ€μ μ¬λ‘ λ° μΌμ΄μ€ μ€ν°λ
μ¬λ¬ μ‘°μ§μ΄ μΉ μ ν리μΌμ΄μ 보μμ κ°μ νκΈ° μν΄ Trusted Typesλ₯Ό μ±κ³΅μ μΌλ‘ ꡬννμ΅λλ€. μλ₯Ό λ€μ΄, ꡬκΈμ μμ¬ μ ν λ° μλΉμ€ μ λ°μ κ±Έμ³ Trusted Typesλ₯Ό κ΄λ²μνκ² μ¬μ©ν΄μμ΅λλ€. 보μμ΄ κ°μ₯ μ€μν κΈμ΅ λ° μ μ μκ±°λ λΆμΌμ λ€λ₯Έ νμ¬λ€λ λ―Όκ°ν μ¬μ©μ λ°μ΄ν°λ₯Ό 보νΈνκ³ κΈμ΅ μ¬κΈ°λ₯Ό λ°©μ§νκΈ° μν΄ Trusted Typesλ₯Ό μ±ννκ³ μμ΅λλ€. μ΄λ¬ν μ€μ μ¬λ‘λ€μ 볡μ‘νκ³ μ€μν νκ²½μμ XSS μνμ μννλ λ° μμ΄ Trusted Typesμ ν¨κ³Όλ₯Ό 보μ¬μ€λλ€.
κ²°λ‘
Trusted Types APIλ XSS 곡격μ λ°©μ§νκΈ° μν κ°λ ₯νκ³ κ°λ°μ μΉνμ μΈ λ©μ»€λμ¦μ μ 곡ν¨μΌλ‘μ¨ μΉ μ ν리μΌμ΄μ 보μμ μ€μν μ§μ μ λνλ λλ€. μμ ν DOM μ‘°μ κ΄νμ κ°μ νκ³ μ μ€ν λ°μ΄ν° μ μ λ° μ ν¨μ± κ²μ¬λ₯Ό μ΄μ§ν¨μΌλ‘μ¨, Trusted Typesλ κ°λ°μκ° λ μμ νκ³ μ λ’°ν μ μλ μΉ μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ μ§μν©λλ€. Trusted Typesλ₯Ό ꡬννλ λ°μλ μ μ€ν κ³νκ³Ό μ€νμ΄ νμνμ§λ§, 보μ κ°ν λ° μ½λ νμ§ ν₯μ μΈ‘λ©΄μμμ μ΄μ μ κ·Έ λ Έλ ₯μ μΆ©λΆν κ°μΉ μκ² λ§λλλ€. Trusted Typesμ λν λΈλΌμ°μ μ§μμ΄ κ³μ μ¦κ°ν¨μ λ°λΌ, μ΄λ μΉ μ·¨μ½μ κ³Όμ μΈμμμ μ μ λ μ€μν λκ΅¬κ° λ κ²μ λλ€.
κΈλ‘λ² μ¬μ©μμ μ μ₯μμ, Trusted Types νμ©κ³Ό κ°μ 보μ λͺ¨λ² μ¬λ‘λ₯Ό μμ©νλ κ²μ κ°λ³ μ ν리μΌμ΄μ μ 보νΈνλ κ²λΏλ§ μλλΌ, λͺ¨λ μ¬λμ μν΄ λ μμ νκ³ μ λ’°ν μ μλ μΉμ μ‘°μ±νλ κ²μ λλ€. μ΄λ λ°μ΄ν°κ° κ΅κ²½μ λμ΄ νλ₯΄κ³ 보μ μΉ¨ν΄κ° κ΄λ²μν κ²°κ³Όλ₯Ό μ΄λν μ μλ κΈλ‘λ²νλ μΈκ³μμ νΉν μ€μν©λλ€. λΉμ μ΄ λμΏμ κ°λ°μμ΄λ , λ°λμ 보μ μ λ¬Έκ°μ΄λ , μνμΈλ£¨μ μ¬μ μ£Όμ΄λ , Trusted Typesμ κ°μ κΈ°μ μ μ΄ν΄νκ³ κ΅¬ννλ κ²μ μμ νκ³ λ³΅μλ ₯ μλ λμ§νΈ μνκ³λ₯Ό ꡬμΆνλ λ° νμμ μ λλ€.