Reactμ experimental_taintUniqueValueκ° λ³΄μ κ° μ²λ¦¬ μλμ λ―ΈμΉλ μ±λ₯ μν₯μ νμν©λλ€. λ°μ΄ν° 무결μ±μ κ°ννκ³ μ ν리μΌμ΄μ μ±λ₯μ λ―ΈμΉλ μν₯μ μμ보μΈμ.
React experimental_taintUniqueValue μ±λ₯: 보μ κ° μ²λ¦¬ μλ μ¬μΈ΅ λΆμ
Reactμ experimental_taintUniqueValueλ μ ν리μΌμ΄μ
λ΄ λ°μ΄ν°μ 보μκ³Ό 무결μ±μ κ°ννλ κ°λ ₯ν λꡬμ
λλ€. Reactμ μ§μμ μΈ μ€νμ κΈ°λ₯μ μΌλΆμΈ μ΄ κΈ°λ₯μ κ°λ°μκ° νΉμ κ°μ "μ€μΌλ(tainted)" κ²μΌλ‘ νμν μ μκ² ν΄μ€λλ€. μ΄λ νΉν μ λ’°ν μ μλ μ
λ ₯μ μ²λ¦¬ν λ ν΄λΉ κ°μ λμ± μ£Όμ κΉκ² λ€λ£¨μ΄μΌ ν¨μ μλ―Έν©λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμμλ experimental_taintUniqueValue μ¬μ©μ΄ μ±λ₯μ λ―ΈμΉλ μν₯, νΉν 보μ κ° μ²λ¦¬ μλμ μ΄μ μ λ§μΆ° μ¬μΈ΅μ μΌλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
experimental_taintUniqueValue μ΄ν΄νκΈ°
μ±λ₯μ λν΄ μμ보기 μ μ experimental_taintUniqueValueκ° λ¬΄μμ νλμ§ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. λ³Έμ§μ μΌλ‘ μ΄λ React μ»΄ν¬λνΈ λ΄ λ°μ΄ν°μ μ€μΌ μΆμ (taint tracking)μ μ μ©νλ λ©μ»€λμ¦μ
λλ€. μ€μΌ μΆμ μ μ λ’°ν μ μλ μμ€(μ: μ¬μ©μ μ
λ ₯, μΈλΆ API)μμ λΉλ‘―λ λ°μ΄ν°λ₯Ό μ μ¬μ μΌλ‘ μ
μμ μΈ κ²μΌλ‘ νμνλ 보μ κΈ°μ μ
λλ€. μ΄λ₯Ό ν΅ν΄ μ΄ μ€μΌλ λ°μ΄ν°κ° μ ν리μΌμ΄μ
μ ν΅ν΄ μ΄λ»κ² νλ₯΄λμ§ λͺ¨λν°λ§νκ³ , μ μ ν μ μ (sanitization)λ μ ν¨μ± κ²μ¬ μμ΄ λ―Όκ°ν μμ
μ μ¬μ©λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
λΈλ‘κ·Έμ λκΈ μΉμ
μ ꡬμΆνλ μλ리μ€λ₯Ό μκ°ν΄ 보μΈμ. μ¬μ©μκ° μ μΆν λκΈμλ μ
μ± μ€ν¬λ¦½νΈλ κΈ°ν μ ν΄ν μ½ν
μΈ κ° ν¬ν¨λ μ μμ΅λλ€. μ μ ν λ³΄νΈ μ₯μΉκ° μμΌλ©΄ μ΄ μ½ν
μΈ κ° μ ν리μΌμ΄μ
μ μ£Όμ
λμ΄ μ¬μ΄νΈ κ° μ€ν¬λ¦½ν
(XSS) μ·¨μ½μ μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. experimental_taintUniqueValueλ μ¬μ©μκ° μ μΆν λκΈμ μ€μΌλ κ²μΌλ‘ νμν μ μκ² ν¨μΌλ‘μ¨ μ΄ μνμ μννλ λ° λμμ μ€ μ μμ΅λλ€. κ·Έλ° λ€μ μ»΄ν¬λνΈ νΈλ¦¬ μ 체μμ μ€μΌλ λ°μ΄ν°κ° μ μ μμ΄ DOMμ μ§μ λ λλ§λλ κ²κ³Ό κ°μ΄ μ μ¬μ μΌλ‘ μνν λ°©μμΌλ‘ μ¬μ©λκ³ μλμ§ νμΈν μ μμ΅λλ€.
experimental_taintUniqueValueμ μλ λ°©μ
experimental_taintUniqueValueμ κΈ°λ³Έ λ©μ»€λμ¦μ μΌλ°μ μΌλ‘ μ€μΌλ κ°κ³Ό μ°κ΄λ κ³ μ μλ³μλ νλκ·Έλ₯Ό μμ±νλ κ²μ ν¬ν¨ν©λλ€. μ΄ μλ³μλ κ°μ΄ μ»΄ν¬λνΈλ ν¨μ κ°μ μ λ¬λ λ ν¨κ» μ νλ©λλ€. μ€μΌλ κ°μ΄ μ μ¬μ μΌλ‘ λ―Όκ°ν 컨ν
μ€νΈμμ μ¬μ©λ λ, μ€μΌ νλκ·Έκ° μλμ§ νμΈνλ κ²μ¬κ° μνλ©λλ€. λ§μ½ μλ€λ©΄, μ μ λ μ΄μ€μΌμ΄νκ³Ό κ°μ μ μ ν 보μ μ‘°μΉκ° μ μ©λ μ μμ΅λλ€.
λ€μμ μ¬μ© λ°©λ²μ λν κ°λ¨ν μμμ λλ€:
import { experimental_taintUniqueValue, experimental_useTaintedValue } from 'react';
function Comment({ comment }) {
const taintedComment = experimental_taintUniqueValue(comment, 'user-submitted-comment');
const safeComment = experimental_useTaintedValue(taintedComment, (value) => {
// Sanitize or escape the value before rendering
return sanitize(value);
});
return <p>{safeComment}</p>;
}
μ΄ μμμμ experimental_taintUniqueValueλ comment propμ μ€μΌλ κ²μΌλ‘ νμνμ¬ μ¬μ©μ μ
λ ₯μμ λΉλ‘―λμμμ λνλ
λλ€. experimental_useTaintedValueλ μ€μΌλ λκΈμ μ¬μ©νμ¬ μ΄λ₯Ό μ μ ν¨μ sanitizeμ μ λ¬νμ¬ μ½ν
μΈ κ° λ λλ§νκΈ°μ μμ νμ§ νμΈν©λλ€.
μ°Έκ³ : the `experimental_useTaintedValue` ν¨μμ μΌλ° APIλ μ€νμ APIμ μΌλΆμ΄λ―λ‘ λ³κ²½λ μ μμ΅λλ€.
μ±λ₯ κ³ λ €μ¬ν
experimental_taintUniqueValueλ κ·μ€ν 보μ μ΄μ μ μ 곡νμ§λ§, μ ν리μΌμ΄μ
μ±λ₯μ λ―ΈμΉλ μν₯μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€. μλ‘μ΄ λ°μ΄ν° μΆμ μ΄λ μ ν¨μ± κ²μ¬ λ©μ»€λμ¦μ λμ
νλ©΄ μ μ¬μ μΌλ‘ μ€λ²ν€λκ° μΆκ°λ μ μμΌλ―λ‘, μ΄ μ€λ²ν€λκ° μ ν리μΌμ΄μ
μ λ°μμ±μ μ΄λ€ μν₯μ λ―ΈμΉ μ μλμ§ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
μ€μΌ μΆμ μ μ€λ²ν€λ
experimental_taintUniqueValueμ μ£Όμ μ±λ₯ μ€λ²ν€λλ λ€μ μμΈμμ λΉλ‘―λ©λλ€:
- κ° νκΉ : κ° μ€μΌλ κ°μ κ³ μ μλ³μλ νλκ·Έλ₯Ό μ°κ΄μν€λ λ° μΆκ° λ©λͺ¨λ¦¬μ μ²λ¦¬κ° νμν©λλ€.
- μ ν: λ°μ΄ν°κ° μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό ν΅ν΄ νλ₯Ό λ μ€μΌ νλκ·Έλ₯Ό μ ννλ κ²μ νΉν λ°μ΄ν°κ° λ§μ μ»΄ν¬λνΈλ₯Ό ν΅κ³Όν κ²½μ° μ€λ²ν€λλ₯Ό μΆκ°ν μ μμ΅λλ€.
- μ€μΌ κ²μ¬: κ°μ΄ μ€μΌλμλμ§ νμΈνλ κ²μ¬λ₯Ό μννλ©΄ μ μ¬μ μΌλ‘ λ―Όκ°ν μμ μ κ³μ° λΉμ©μ΄ μΆκ°λ©λλ€.
λ λλ§ μ±λ₯μ λ―ΈμΉλ μν₯
experimental_taintUniqueValueκ° λ λλ§ μ±λ₯μ λ―ΈμΉλ μν₯μ λ€μμ ν¬ν¨ν μ¬λ¬ μμΈμ λ°λΌ λ¬λΌμ§λλ€:
- μ¬μ© λΉλ:
experimental_taintUniqueValueλ₯Ό λ μμ£Ό μ¬μ©ν μλ‘ λ λλ§ μ±λ₯μ λ―ΈμΉλ μ μ¬μ μν₯μ΄ μ»€μ§λλ€. μ ν리μΌμ΄μ λ°μ΄ν°μ μΌλΆμλ§ μ¬μ©νλ κ²½μ° κ·Έ μν₯μ λ―Έλ―Έν μ μμ΅λλ€. - μ€μΌ κ²μ¬μ 볡μ‘μ±: κ°μ΄ μ€μΌλμλμ§ νμΈνκΈ° μν΄ μννλ κ²μ¬μ 볡μ‘μ± λν μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€. νλκ·Έ λΉκ΅μ κ°μ κ°λ¨ν κ²μ¬λ λ°μ΄ν°μμ ν¨ν΄μ μ°Ύλ κ²κ³Ό κ°μ λ 볡μ‘ν κ²μ¬λ³΄λ€ μν₯μ΄ μ μ΅λλ€.
- μ»΄ν¬λνΈ μ λ°μ΄νΈ λΉλ: μ€μΌλ λ°μ΄ν°κ° μμ£Ό μ λ°μ΄νΈλλ μ»΄ν¬λνΈμμ μ¬μ©λλ κ²½μ°, μ€μΌ μΆμ μ μ€λ²ν€λλ μ¦νλ©λλ€.
μ±λ₯ μΈ‘μ
μ ν리μΌμ΄μ
μμ experimental_taintUniqueValueμ μ±λ₯ μν₯μ μ ννκ² νκ°νλ €λ©΄ μ² μ ν μ±λ₯ ν
μ€νΈλ₯Ό μννλ κ²μ΄ μ€μν©λλ€. Reactλ λ€μμ ν¬ν¨νμ¬ μ±λ₯μ μΈ‘μ νκΈ° μν μ¬λ¬ λꡬμ κΈ°μ μ μ 곡ν©λλ€:
- React Profiler: React Profilerλ React μ»΄ν¬λνΈμ μ±λ₯μ μΈ‘μ ν μ μκ² ν΄μ£Όλ λΈλΌμ°μ νμ₯ νλ‘κ·Έλ¨μ λλ€. μ΄λ€ μ»΄ν¬λνΈκ° λ λλ§νλ λ° κ°μ₯ μ€λ κ±Έλ¦¬κ³ κ·Έ μ΄μ λ 무μμΈμ§μ λν ν΅μ°°λ ₯μ μ 곡ν©λλ€.
- μ±λ₯ λ©νΈλ¦: νλ μ μλ λ° CPU μ¬μ©λκ³Ό κ°μ λΈλΌμ°μ μ±λ₯ λ©νΈλ¦μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ μ λ°μ μΈ μ±λ₯μ νκ°ν μλ μμ΅λλ€.
- νλ‘νμΌλ§ λꡬ: Chrome DevToolsμ μ±λ₯ νμ΄λ μ μ© νλ‘νμΌλ§ λꡬμ κ°μ λꡬλ CPU μ¬μ©λ, λ©λͺ¨λ¦¬ ν λΉ λ° κ°λΉμ§ 컬λ μ μ λν λ κΉμ ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λλ€.
μ±λ₯μ μΈ‘μ ν λλ experimental_taintUniqueValueλ₯Ό νμ±ννμ λμ λΉνμ±ννμ λ λͺ¨λ ν
μ€νΈνμ¬ κ·Έ μν₯μ λͺ
ννκ² μ΄ν΄ν΄μΌ ν©λλ€. λν, κ²°κ³Όκ° μ€μ μ¬μ© νκ²½μ μ ννκ² λ°μνλλ‘ νμ€μ μΈ λ°μ΄ν° μΈνΈμ μ¬μ©μ μλ리μ€λ‘ ν
μ€νΈνμΈμ.
experimental_taintUniqueValueλ‘ μ±λ₯ μ΅μ ννκΈ°
experimental_taintUniqueValueλ μ±λ₯ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ§λ§, κ·Έ μν₯μ μ΅μννκΈ° μν΄ μ¬μ©ν μ μλ λͺ κ°μ§ μ λ΅μ΄ μμ΅λλ€:
μ νμ μ€μΌ
μ€μ λ‘ μ λ’°ν μ μλ μμ€μμ λΉλ‘―λ λ°μ΄ν°λ§ μ€μΌμν€μΈμ. λ΄λΆμ μΌλ‘ μμ±λμκ±°λ μ΄λ―Έ μ ν¨μ± κ²μ¬λ₯Ό κ±°μΉ λ°μ΄ν°λ μ€μΌμν€μ§ λ§μΈμ.
μλ₯Ό λ€μ΄, μ¬μ©μκ° μ΄λ¦κ³Ό μ΄λ©μΌ μ£Όμλ₯Ό μ λ ₯νλ μμμ μκ°ν΄ 보μΈμ. μμμ λ μ΄λΈμ΄λ λ€λ₯Έ μ μ μμκ° μλ, μ λ ₯ νλμ λ°μ΄ν°λ§ μ€μΌμμΌμΌ ν©λλ€.
μ§μ° μ€μΌ(Lazy Tainting)
λ°μ΄ν°κ° μ€μ λ‘ νμν λκΉμ§ μ€μΌμ 미루μΈμ. λ―Όκ°ν μμ μ μ¦μ μ¬μ©λμ§ μλ λ°μ΄ν°κ° μλ€λ©΄, μ¬μ© μμ μ κ°κΉμμ§ λκΉμ§ κΈ°λ€λ Έλ€κ° μ€μΌμν¬ μ μμ΅λλ€.
μλ₯Ό λ€μ΄, APIμμ λ°μ΄ν°λ₯Ό λ°μΌλ©΄, ν΄λΉ λ°μ΄ν°κ° λ λλ§λκ±°λ λ°μ΄ν°λ² μ΄μ€ 쿼리μ μ¬μ©λκΈ° μ§μ κΉμ§ κΈ°λ€λ Έλ€κ° μ€μΌμν¬ μ μμ΅λλ€.
λ©λͺ¨μ΄μ μ΄μ (Memoization)
λΆνμνκ² λ°μ΄ν°λ₯Ό λ€μ μ€μΌμν€λ κ²μ νΌνκΈ° μν΄ λ©λͺ¨μ΄μ μ΄μ κΈ°μ μ μ¬μ©νμΈμ. μ΄λ―Έ κ°μ μ€μΌμμΌ°λ€λ©΄, μ€μΌλ κ°μ λ©λͺ¨μ μ μ₯νκ³ μλ³Έ κ°μ΄ λ³κ²½λμ§ μμλ€λ©΄ μ¬μ¬μ©ν μ μμ΅λλ€.
Reactλ React.memoμ useMemoμ κ°μ΄ λ©λͺ¨μ΄μ μ΄μ
μ ν¨κ³Όμ μΌλ‘ ꡬννλ λ° λμμ΄ λλ μ¬λ¬ λ©λͺ¨μ΄μ μ΄μ
λꡬλ₯Ό μ 곡ν©λλ€.
ν¨μ¨μ μΈ μ€μΌ κ²μ¬
κ°μ΄ μ€μΌλμλμ§ νμΈνκΈ° μν΄ μννλ κ²μ¬λ₯Ό μ΅μ ννμΈμ. κ°λ₯νλ©΄ κ°λ¨νκ³ ν¨μ¨μ μΈ κ²μ¬λ₯Ό μ¬μ©νμΈμ. μλΉν μ²λ¦¬κ° νμν 볡μ‘ν κ²μ¬λ νΌνμΈμ.
μλ₯Ό λ€μ΄, λ°μ΄ν°μμ ν¨ν΄μ κ²μνλ λμ , λ¨μν μ€μΌ νλκ·Έμ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈν μ μμ΅λλ€.
μ λ°μ΄νΈ μΌκ΄ μ²λ¦¬(Batching)
ν λ²μ μ¬λ¬ κ°μ μ€μΌμν€λ κ²½μ°, 리λ λλ§ νμλ₯Ό μ€μ΄κΈ° μν΄ μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νμΈμ. Reactλ λ§μ κ²½μ° μλμΌλ‘ μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νμ§λ§, νμν λ ReactDOM.unstable_batchedUpdatesλ₯Ό μ¬μ©νμ¬ μλμΌλ‘ μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬ν μλ μμ΅λλ€.
μ½λ λΆν (Code Splitting)
μ½λ λΆν μ ꡬννμ¬ λ‘λνκ³ νμ±ν΄μΌ νλ JavaScriptμ μμ μ€μ΄μΈμ. μ΄λ μ ν리μΌμ΄μ
μ μ΄κΈ° λ‘λ μκ°μ κ°μ νκ³ experimental_taintUniqueValueμ μ λ°μ μΈ μ±λ₯ μν₯μ μ€μΌ μ μμ΅λλ€.
Reactλ λμ μν¬νΈ(dynamic imports)μ React.lazy APIμ κ°μ μ¬λ¬ μ½λ λΆν κΈ°μ μ μ 곡ν©λλ€.
μ€μ μ¬λ‘ λ° κ³ λ €μ¬ν
μ¬λ‘ 1: μ μμκ±°λ μν 리뷰
μ¬μ©μκ° μν 리뷰λ₯Ό μ μΆν μ μλ μ μμκ±°λ νλ«νΌμ μκ°ν΄ 보μΈμ. μ¬μ©μ 리뷰λ λ³Έμ§μ μΌλ‘ μ λ’°ν μ μλ λ°μ΄ν°μ΄λ―λ‘ XSS 곡격μ λ°©μ§νκΈ° μν΄ μ μ€νκ² λ€λ£¨μ΄μΌ ν©λλ€.
μ¬μ©μκ° λ¦¬λ·°λ₯Ό μ μΆνλ©΄, 리뷰 ν
μ€νΈλ μ¦μ experimental_taintUniqueValueλ₯Ό μ¬μ©νμ¬ μ€μΌλμ΄μΌ ν©λλ€. 리뷰 ν
μ€νΈκ° μ ν리μΌμ΄μ
μ ν΅ν΄ νλ₯Ό λ, μν νμ΄μ§μ 리뷰λ₯Ό λ λλ§νκ±°λ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκΈ° μ μ μ€μΌ κ²μ¬λ₯Ό μνν΄μΌ ν©λλ€.
HTML μ΄μ€μΌμ΄νμ΄λ DOMPurifyμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ λ±μ μ μ κΈ°μ μ μ€μΌλ 리뷰 ν μ€νΈμ μ μ©νμ¬ λ λλ§νκΈ° μ μ μ μ± μ½λλ₯Ό μ κ±°ν΄μΌ ν©λλ€.
μ¬λ‘ 2: μμ λ―Έλμ΄ λκΈ μμ€ν
μμ λ―Έλμ΄ νλ«νΌμ μ¬μ©μκ° λ€μν κ²μλ¬Όμ λκΈμ λ¬ μ μλλ‘ νμ©ν©λλ€. μ΄λ¬ν λκΈμλ μ’ μ’ URL, λ©μ λ° κΈ°ν μ μ¬μ μΌλ‘ μνν μ½ν μΈ κ° ν¬ν¨λ©λλ€.
μ¬μ©μκ° λκΈμ κ²μνλ©΄, μ 체 λκΈ λ¬Έμμ΄μ΄ μ€μΌλμ΄μΌ ν©λλ€. λκΈμ νμνκΈ° μ μ μ ν리μΌμ΄μ μ μ€μΌ κ²μ¬λ₯Ό μννκ³ μ μ ν μ μ κΈ°μ μ μ μ©ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, URLμ μλ €μ§ μ μ± μΉμ¬μ΄νΈμ λΈλ리μ€νΈμ λμ‘°νμ¬ νμΈν μ μκ³ , μ¬μ©μ λ©μ μ μ ν¨ν μ¬μ©μλ₯Ό μ°Έμ‘°νλμ§ νμΈνμ¬ μ ν¨μ±μ κ²μ¬ν μ μμ΅λλ€.
μ¬λ‘ 3: κ΅μ ν(i18n)
κ΅μ νλ μ’ μ’ μΈλΆ νμΌμ΄λ λ°μ΄ν°λ² μ΄μ€μμ λ²μμ λ‘λνλ κ²μ ν¬ν¨ν©λλ€. μ΄λ¬ν λ²μμ μ μ¬μ μΌλ‘ μ‘°μλ μ μμ΄ λ³΄μ μ·¨μ½μ μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
λ²μμ λ‘λν λ, λ²μ λ¬Έμμ΄μ μ€μΌλμ΄μΌ ν©λλ€. λ²μ λ¬Έμμ΄μ μ¬μ©νκΈ° μ μ, λ¬Έμμ΄μ΄ μμ λμ§ μμλμ§ νμΈνκΈ° μν΄ μ€μΌ κ²μ¬λ₯Ό μνν΄μΌ ν©λλ€. λ¬Έμμ΄μ΄ μ€μΌλ κ²½μ°, μ¬μ©μμκ² νμλκΈ° μ μ μ ν¨μ±μ κ²μ¬νκ±°λ μ μ ν΄μΌ ν©λλ€. μ΄ μ ν¨μ± κ²μ¬μλ μλ €μ§ μ μ λ²μ κ³Ό λ¬Έμμ΄μ λΉκ΅νκ±°λ μ μ¬μ μΌλ‘ μ ν΄ν λ¬Έμλ₯Ό μλμΌλ‘ μ΄μ€μΌμ΄ννλ λ²μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ ν¬ν¨λ μ μμ΅λλ€.
κΈλ‘λ² κ³ λ €μ¬ν
κΈλ‘λ² μ ν리μΌμ΄μ
μμ experimental_taintUniqueValueλ₯Ό μ¬μ©ν λ, λ€μ μ¬νμ κ³ λ €νλ κ²μ΄ μ€μν©λλ€:
- λ¬Έμ μΈμ½λ©: μ ν리μΌμ΄μ μ΄ λ€λ₯Έ λ¬Έμ μΈμ½λ©μ μ¬λ°λ₯΄κ² μ²λ¦¬νλμ§ νμΈνμΈμ. μ μμ μΈ νμμλ λ¬Έμ μΈμ½λ©κ³Ό κ΄λ ¨λ μ·¨μ½μ μ μ΄μ©νμ¬ μ€μΌ κ²μ¬λ₯Ό μ°ννλ €κ³ μλν μ μμ΅λλ€.
- μ§μν: λ€λ₯Έ μ§μμ λ€μν λ¬Ένμ κ·λ²κ³Ό λ―Όκ°μ±μ μΈμ§νμΈμ. νΉμ κ΅κ°μ μ¬μ©μμκ² λΆμΎνκ±°λ ν΄λ‘μΈ μ μλ μ½ν μΈ λ₯Ό νμνμ§ λ§μΈμ.
- λ²λ₯ μ€μ: λ°μ΄ν° 보μ λ° κ°μΈ μ 보 보νΈμ κ΄ν λͺ¨λ κ΄λ ¨ λ²λ₯ λ° κ·μ μ μ€μνμΈμ. μ¬κΈ°μλ κ°μΈ λ°μ΄ν°λ₯Ό μμ§νκ±°λ μ²λ¦¬νκΈ° μ μ μ¬μ©μ λμλ₯Ό μ»λ κ²μ΄ ν¬ν¨λ μ μμ΅λλ€.
experimental_taintUniqueValueμ λμ
experimental_taintUniqueValueλ μ€μΌ μΆμ μ μν κ°λ ₯ν λ©μ»€λμ¦μ μ 곡νμ§λ§, μ΄κ²μ΄ μ μΌν μ νμ§λ μλλλ€. νΉμ μꡬμ¬νκ³Ό μ건μ λ°λΌ λ€μκ³Ό κ°μ λμμ μΈ μ κ·Ό λ°©μμ κ³ λ €ν μ μμ΅λλ€:
- μ λ ₯ μ ν¨μ± κ²μ¬: μ ν리μΌμ΄μ μ λ€μ΄μ€λ λͺ¨λ λ°μ΄ν°κ° μ ν¨νκ³ μμ νμ§ νμΈνκΈ° μν΄ κ°λ ₯ν μ λ ₯ μ ν¨μ± κ²μ¬λ₯Ό ꡬννμΈμ. μ΄λ λ§μ 보μ μ·¨μ½μ μ΄ λ°μνκΈ° μ μ μλ°©νλ λ° λμμ΄ λ μ μμ΅λλ€.
- μΆλ ₯ μΈμ½λ©: HTML μ΄μ€μΌμ΄ν λ° URL μΈμ½λ©κ³Ό κ°μ μΆλ ₯ μΈμ½λ© κΈ°μ μ μ¬μ©νμ¬ μ μ± μ½λκ° μ ν리μΌμ΄μ μ μΆλ ₯μ μ£Όμ λλ κ²μ λ°©μ§νμΈμ.
- μ½ν μΈ λ³΄μ μ μ± (CSP): μ ν리μΌμ΄μ μ΄ λ‘λν μ μλ 리μμ€ μ νμ μ ννκΈ° μν΄ κ°λ ₯ν μ½ν μΈ λ³΄μ μ μ± μ ꡬννμΈμ. μ΄λ μ λ’°ν μ μλ μ€ν¬λ¦½νΈμ μ€νμ λ°©μ§νμ¬ XSS 곡격μ μλ°©νλ λ° λμμ΄ λ μ μμ΅λλ€.
- μλνν° λΌμ΄λΈλ¬λ¦¬: DOMPurify λ° OWASP Java HTML Sanitizerμ κ°μ μλνν° λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©νμ¬ HTML μ½ν μΈ λ₯Ό μ μ νκ³ XSS 곡격μ λ°©μ§νμΈμ.
κ²°λ‘
experimental_taintUniqueValueλ React μ ν리μΌμ΄μ
μ λ°μ΄ν° 보μκ³Ό 무결μ±μ ν₯μμν€λ κ·μ€ν λꡬμ
λλ€. κ·Έλ¬λ μ±λ₯μ λ―ΈμΉλ μν₯μ μ μ€νκ² κ³ λ €νκ³ νλͺ
νκ² μ¬μ©νλ κ²μ΄ μ€μν©λλ€. μ€μΌ μΆμ μ μ€λ²ν€λλ₯Ό μ΄ν΄νκ³ μ΅μ ν μ λ΅μ ꡬνν¨μΌλ‘μ¨ μ ν리μΌμ΄μ
μ λ°μμ±μ λ―ΈμΉλ μν₯μ μ΅μνν μ μμ΅λλ€.
experimental_taintUniqueValueλ₯Ό ꡬνν λλ μ² μ ν μ±λ₯ ν
μ€νΈλ₯Ό μννκ³ νΉμ μꡬμ¬νκ³Ό μ건μ λ°λΌ μ κ·Ό λ°©μμ μ‘°μ ν΄μΌ ν©λλ€. λν, μ
λ ₯ μ ν¨μ± κ²μ¬ λ° μΆλ ₯ μΈμ½λ©κ³Ό κ°μ λ체 보μ μ‘°μΉλ₯Ό κ³ λ €νμ¬ λ³΄μ μ·¨μ½μ±μ λν ν¬κ΄μ μΈ λ°©μ΄λ₯Ό μ 곡νμΈμ.
experimental_taintUniqueValueλ μμ§ μ€νμ μΈ κΈ°λ₯μ΄λ―λ‘ ν₯ν React λ²μ μμ APIμ λμμ΄ λ³κ²½λ μ μμ΅λλ€. μ΅μ React λ¬Έμμ λͺ¨λ² μ¬λ‘λ₯Ό μ΅μ μνλ‘ μ μ§νμ¬ ν¨κ³Όμ μ΄κ³ μμ νκ² μ¬μ©νκ³ μλμ§ νμΈνμΈμ.