μλ°μ€ν¬λ¦½νΈ 보μμ μν ν¬κ΄μ μΈ νλ μμν¬λ₯Ό μμ보μΈμ. XSS, CSRF, λ°μ΄ν° λλκ³Ό κ°μ ν΄λΌμ΄μΈνΈ μΈ‘ μνμΌλ‘λΆν° μΉ μ ν리μΌμ΄μ μ 보νΈνλ ν΅μ¬ μ λ΅μ λ°°μλλ€.
μΉ λ³΄μ ꡬν νλ μμν¬: ν¬κ΄μ μΈ μλ°μ€ν¬λ¦½νΈ λ³΄νΈ μ λ΅
νλμ λμ§νΈ μνκ³μμ μλ°μ€ν¬λ¦½νΈλ μνΈμμ©νλ μΉμ λͺ μ€μλΆν μμ§μ λλ€. λμΏμ μ μμκ±°λ μ¬μ΄νΈμ λμ μ¬μ©μ μΈν°νμ΄μ€λΆν° λ΄μμ κΈμ΅ κΈ°κ΄μ μν 볡μ‘ν λ°μ΄ν° μκ°νμ μ΄λ₯΄κΈ°κΉμ§ λͺ¨λ κ²μ ꡬλν©λλ€. κ·Έλ¬λ μ΄λ¬ν 보νΈμ±μ μλ°μ€ν¬λ¦½νΈλ₯Ό μ μμ μΈ κ³΅κ²©μλ€μ μ£Όμ νμ μΌλ‘ λ§λλλ€. μ μΈκ³ μ‘°μ§λ€μ΄ λ νλΆν μ¬μ©μ κ²½νμ μΆκ΅¬ν¨μ λ°λΌ ν΄λΌμ΄μΈνΈ μΈ‘ 곡격 νλ©΄μ΄ νμ₯λμ΄ κΈ°μ κ³Ό κ³ κ°μ μλΉν μνμ λ ΈμΆμν΅λλ€. λ μ΄μ μ¬ν λμμ μΈ ν¨μΉ κΈ°λ° λ³΄μ μ κ·Ό λ°©μμΌλ‘λ μΆ©λΆνμ§ μμ΅λλ€. νμν κ²μ κ°λ ₯ν μλ°μ€ν¬λ¦½νΈ 보νΈλ₯Ό ꡬννκΈ° μν μ μ μ μ΄κ³ ꡬ쑰νλ νλ μμν¬μ λλ€.
μ΄ κΈμ μλ°μ€ν¬λ¦½νΈλ‘ ꡬλλλ μΉ μ ν리μΌμ΄μ μ 보νΈνκΈ° μν κΈλ‘λ²νκ³ ν¬κ΄μ μΈ νλ μμν¬λ₯Ό μ 곡ν©λλ€. μ°λ¦¬λ κ°λ¨ν μμ μ λμ΄ ν΄λΌμ΄μΈνΈ μΈ‘ μ½λμ λ΄μ¬λ ν΅μ¬ μ·¨μ½μ μ ν΄κ²°νλ κ³μΈ΅νλ μ¬μΈ΅ λ°©μ΄ μ λ΅μ νꡬν κ²μ λλ€. κ°λ°μ, 보μ μν€ν νΈ, κΈ°μ 리λ λ± λꡬμκ²λ μ΄ κ°μ΄λλ λ νλ ₯μ μ΄κ³ μμ ν μΉ μ‘΄μ¬κ°μ ꡬμΆνκΈ° μν μμΉκ³Ό μ€μ©μ μΈ κΈ°μ μ μ 곡ν κ²μ λλ€.
ν΄λΌμ΄μΈνΈ μΈ‘ μν νκ²½ μ΄ν΄νκΈ°
ν΄κ²°μ± μ λ ΌμνκΈ° μ μ, μ°λ¦¬ μ½λκ° μλνλ νκ²½μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. ν΅μ λκ³ μ λ’°ν μ μλ νκ²½μμ μ€νλλ μλ² μΈ‘ μ½λμ λ¬λ¦¬, ν΄λΌμ΄μΈνΈ μΈ‘ μλ°μ€ν¬λ¦½νΈλ μ¬μ©μμ λΈλΌμ°μ λ΄μμ μ€νλ©λλ€. μ΄ νκ²½μ λ³Έμ§μ μΌλ‘ μ λ’°ν μ μμΌλ©° μλ§μ λ³μμ λ ΈμΆλμ΄ μμ΅λλ€. μ΄ κ·Όλ³Έμ μΈ μ°¨μ΄μ μ΄ λ§μ μΉ λ³΄μ λ¬Έμ μ μμΈμ λλ€.
μ£Όμ μλ°μ€ν¬λ¦½νΈ κ΄λ ¨ μ·¨μ½μ
- ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν
(XSS): μλ§λ κ°μ₯ μ μλ €μ§ ν΄λΌμ΄μΈνΈ μΈ‘ μ·¨μ½μ μΌ κ²μ
λλ€. 곡격μλ μ λ’°ν μ μλ μΉμ¬μ΄νΈμ μ
μ± μ€ν¬λ¦½νΈλ₯Ό μ£Όμ
νκ³ , μ΄ μ€ν¬λ¦½νΈλ νΌν΄μμ λΈλΌμ°μ μμ μ€νλ©λλ€. XSSμλ μΈ κ°μ§ μ£Όμ λ³νμ΄ μμ΅λλ€:
- μ μ₯ν XSS(Stored XSS): μ μ± μ€ν¬λ¦½νΈκ° λκΈ νλλ μ¬μ©μ νλ‘ν λ±μ ν΅ν΄ λ°μ΄ν°λ² μ΄μ€μ κ°μ΄ λμ μλ²μ μꡬμ μΌλ‘ μ μ₯λ©λλ€. μν₯μ λ°λ νμ΄μ§λ₯Ό λ°©λ¬Ένλ λͺ¨λ μ¬μ©μμκ² μ μ± μ€ν¬λ¦½νΈκ° μ 곡λ©λλ€.
- λ°μ¬ν XSS(Reflected XSS): μ μ± μ€ν¬λ¦½νΈκ° URLμ΄λ λ€λ₯Έ μμ² λ°μ΄ν°μ ν¬ν¨λ©λλ€. μλ²κ° μ΄ λ°μ΄ν°λ₯Ό μ¬μ©μ λΈλΌμ°μ μ λ€μ λ°μ¬ν λ(μ: κ²μ κ²°κ³Ό νμ΄μ§), μ€ν¬λ¦½νΈκ° μ€νλ©λλ€.
- DOM κΈ°λ° XSS(DOM-based XSS): μ·¨μ½μ μ΄ μ μ μΌλ‘ ν΄λΌμ΄μΈνΈ μΈ‘ μ½λμ μμ΅λλ€. μ€ν¬λ¦½νΈκ° μ¬μ©μ μ 곡 λ°μ΄ν°λ₯Ό μμ νμ§ μμ λ°©μμΌλ‘ μ¬μ©νμ¬ λ¬Έμ κ°μ²΄ λͺ¨λΈ(DOM)μ μμ ν¨μΌλ‘μ¨, λ°μ΄ν°κ° λΈλΌμ°μ λ₯Ό λ λμ§ μκ³ λ μ½λ μ€νμΌλ‘ μ΄μ΄μ§λλ€.
- ν¬λ‘μ€ μ¬μ΄νΈ μμ² μμ‘°(CSRF): CSRF 곡격μμλ μ μμ μΈ μΉμ¬μ΄νΈ, μ΄λ©μΌ λλ νλ‘κ·Έλ¨μ΄ μ¬μ©μμ μΉ λΈλΌμ°μ λ‘ νμ¬κΈ μ¬μ©μκ° νμ¬ μΈμ¦λ μ λ’°ν μ μλ μ¬μ΄νΈμμ μμΉ μλ μμ μ μννλλ‘ μ λν©λλ€. μλ₯Ό λ€μ΄, μ¬μ©μκ° μ μ± μ¬μ΄νΈμ λ§ν¬λ₯Ό ν΄λ¦νλ©΄ μμ λ λͺ¨λ₯΄κ² μν μΉμ¬μ΄νΈμ μκΈ μ΄μ²΄λ₯Ό μμ²νλ νΈλ¦¬κ±°κ° λ°μν μ μμ΅λλ€.
- λ°μ΄ν° μ€ν€λ°(λ©μ΄μ§μΉ΄νΈ μ€νμΌ κ³΅κ²©): 곡격μκ° μ μμκ±°λ κ²°μ νμ΄μ§λ μ§λΆ μμμ μ μ± μλ°μ€ν¬λ¦½νΈλ₯Ό μ£Όμ νλ μ κ΅ν μνμ λλ€. μ΄ μ½λλ μ μ©μΉ΄λ μ 보μ κ°μ λ―Όκ°ν μ 보λ₯Ό μ‘°μ©ν μΊ‘μ²(μ€ν€λ°)νμ¬ κ³΅κ²©μκ° μ μ΄νλ μλ²λ‘ μ μ‘ν©λλ€. μ΄λ¬ν 곡격μ μ’ μ’ μμλ μλνν° μ€ν¬λ¦½νΈμμ λΉλ‘―λμ΄ νμ§νκΈ°κ° λ§€μ° μ΄λ ΅μ΅λλ€.
- μλνν° μ€ν¬λ¦½νΈ μν λ° κ³΅κΈλ§ 곡격: νλ μΉμ λΆμ, κ΄κ³ , κ³ κ° μ§μ μμ ― λ±μ μν λ°©λν μλνν° μ€ν¬λ¦½νΈ μνκ³ μμ ꡬμΆλ©λλ€. μ΄λ¬ν μλΉμ€λ μμ²λ κ°μΉλ₯Ό μ 곡νμ§λ§ μλΉν μνλ μ΄λν©λλ€. λ§μ½ μ΄λ¬ν μΈλΆ μ 곡μ 체 μ€ νλλΌλ μμλλ©΄, κ·Έλ€μ μ μ± μ€ν¬λ¦½νΈλ μ¬μ©μμ μΉμ¬μ΄νΈκ° κ°μ§ λͺ¨λ μ λ’°μ κΆνμ μμλ°μ μ¬μ©μμκ² μ§μ μ 곡λ©λλ€.
- ν΄λ¦μ¬νΉ(Clickjacking): μ΄κ²μ 곡격μκ° μ¬λ¬ κ°μ ν¬λͺ νκ±°λ λΆν¬λͺ ν λ μ΄μ΄λ₯Ό μ¬μ©νμ¬ μ¬μ©μκ° μ΅μμ νμ΄μ§λ₯Ό ν΄λ¦νλ € ν λ λ€λ₯Έ νμ΄μ§μ λ²νΌμ΄λ λ§ν¬λ₯Ό ν΄λ¦νλλ‘ μμ΄λ UI μμ₯ 곡격μ λλ€. μ΄λ₯Ό ν΅ν΄ λ¬΄λ¨ μμ μ μννκ±°λ, κΈ°λ° μ 보λ₯Ό λ ΈμΆνκ±°λ, μ¬μ©μμ μ»΄ν¨ν°λ₯Ό μ μ΄ν μ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈ 보μ νλ μμν¬μ ν΅μ¬ μμΉ
ν¨κ³Όμ μΈ λ³΄μ μ λ΅μ κ²¬κ³ ν μμΉμ κΈ°μ΄ μμ μΈμμ§λλ€. μ΄λ¬ν μ§μΉ¨ κ°λ μ 보μ μ‘°μΉκ° μΌκ΄μ± μκ³ ν¬κ΄μ μ΄λ©° μ μ κ°λ₯νλλ‘ λ³΄μ₯νλ λ° λμμ΄ λ©λλ€.
- μ΅μ κΆν μμΉ: λͺ¨λ μ€ν¬λ¦½νΈμ κ΅¬μ± μμλ ν©λ²μ μΈ κΈ°λ₯μ μννλ λ° μ λμ μΌλ‘ νμν κΆνλ§ κ°μ ΈμΌ ν©λλ€. μλ₯Ό λ€μ΄, μ°¨νΈλ₯Ό νμνλ μ€ν¬λ¦½νΈλ μμ νλμμ λ°μ΄ν°λ₯Ό μ½κ±°λ μμμ λλ©μΈμΌλ‘ λ€νΈμν¬ μμ²μ ν μ μλ κΆνμ΄ μμ΄μΌ ν©λλ€.
- μ¬μΈ΅ λ°©μ΄: λ¨μΌ 보μ ν΅μ μ μμ‘΄νλ κ²μ μ¬μμ λΆλ₯΄λ μ§λ¦κΈΈμ λλ€. κ³μΈ΅μ μ κ·Ό λ°©μμ ν λ°©μ΄μ μ΄ μ€ν¨νλλΌλ λ€λ₯Έ λ°©μ΄μ μ΄ μνμ μνν μ μλλ‘ λ³΄μ₯ν©λλ€. μλ₯Ό λ€μ΄, XSSλ₯Ό λ°©μ§νκΈ° μν΄ μλ²½ν μΆλ ₯ μΈμ½λ©μ νλλΌλ κ°λ ₯ν μ½ν μΈ λ³΄μ μ μ± μ μ€μν λ λ²μ§Έ λ³΄νΈ κ³μΈ΅μ μ 곡ν©λλ€.
- κΈ°λ³Έμ μΌλ‘ μμ νκ²(Secure by Default): 보μμ λμ€μ μΆκ°νλ κ²μ΄ μλλΌ κ°λ° μλͺ μ£ΌκΈ°μ λ΄μ₯λ κΈ°λ³Έ μꡬμ¬νμ΄μ΄μΌ ν©λλ€. μ΄λ μμ ν νλ μμν¬λ₯Ό μ ννκ³ , 보μμ μΌλμ λκ³ μλΉμ€λ₯Ό ꡬμ±νλ©°, κ°λ°μμκ² μμ ν κ²½λ‘λ₯Ό κ°μ₯ μ¬μ΄ κ²½λ‘λ‘ λ§λλ κ²μ μλ―Έν©λλ€.
- μ λ’°νλ κ²μ¦νλΌ(μ€ν¬λ¦½νΈμ λν μ λ‘ νΈλ¬μ€νΈ): μ΄λ€ μ€ν¬λ¦½νΈλ, νΉν μλνν° μ€ν¬λ¦½νΈλ₯Ό μ묡μ μΌλ‘ μ λ’°νμ§ λ§μμμ€. λͺ¨λ μ€ν¬λ¦½νΈλ κ²μ¦λκ³ , κ·Έ λμμ΄ μ΄ν΄λλ©°, κΆνμ΄ μ νλμ΄μΌ ν©λλ€. μμ μ§νκ° μλμ§ μ§μμ μΌλ‘ νλμ λͺ¨λν°λ§ν΄μΌ ν©λλ€.
- μλν λ° λͺ¨λν°λ§: μΈκ°μ κ°λ μ μ€λ₯κ° λ°μνκΈ° μ½κ³ νμ₯ν μ μμ΅λλ€. μλνλ λꡬλ₯Ό μ¬μ©νμ¬ μ·¨μ½μ μ μ€μΊνκ³ , 보μ μ μ± μ μννλ©°, μ€μκ°μΌλ‘ μ΄μ μ§νλ₯Ό λͺ¨λν°λ§νμμμ€. μ§μμ μΈ λͺ¨λν°λ§μ κ³΅κ²©μ΄ λ°μνλ μ¦μ νμ§νκ³ λμνλ λ° ν΅μ¬μ λλ€.
ꡬν νλ μμν¬: μ£Όμ μ λ΅ λ° μ μ΄
μμΉμ΄ ν립λμμΌλ, μ΄μ μλ°μ€ν¬λ¦½νΈ 보μ νλ μμν¬μ κΈ°λ₯μ νμ±νλ μ€μ©μ μ΄κ³ κΈ°μ μ μΈ μ μ΄λ€μ μ΄ν΄λ³΄κ² μ΅λλ€. μ΄λ¬ν μ λ΅λ€μ κ°λ ₯ν λ°©μ΄ νμΈλ₯Ό λ§λ€κΈ° μν΄ κ³μΈ΅μ μΌλ‘ ꡬνλμ΄μΌ ν©λλ€.
1. μ½ν μΈ λ³΄μ μ μ± (CSP): 첫 λ²μ§Έ λ°©μ΄μ
μ½ν μΈ λ³΄μ μ μ± (CSP)μ μ¬μ©μ μμ΄μ νΈ(λΈλΌμ°μ )κ° νΉμ νμ΄μ§μ λν΄ λ‘λν μ μλ 리μμ€λ₯Ό μΈλ°νκ² μ μ΄ν μ μκ² ν΄μ£Όλ HTTP μλ΅ ν€λμ λλ€. μ΄λ XSS λ° λ°μ΄ν° μ€ν€λ° 곡격μ μννλ κ°μ₯ κ°λ ₯ν λꡬ μ€ νλμ λλ€.
μλ λ°©μ: μ€ν¬λ¦½νΈ, μ€νμΌμνΈ, μ΄λ―Έμ§, κΈκΌ΄ λ± λ€μν μ½ν μΈ μ νμ λν΄ μ λ’°ν μ μλ μμ€μ νμ΄νΈλ¦¬μ€νΈλ₯Ό μ μν©λλ€. νμ΄μ§κ° νμ΄νΈλ¦¬μ€νΈμ μλ μμ€μμ 리μμ€λ₯Ό λ‘λνλ €κ³ νλ©΄ λΈλΌμ°μ κ° μ΄λ₯Ό μ°¨λ¨ν©λλ€.
CSP ν€λ μμ:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-analytics.com; img-src *; style-src 'self' 'unsafe-inline'; report-uri /csp-violation-report-endpoint;
μ£Όμ μ§μλ¬Έ λ° λͺ¨λ² μ¬λ‘:
default-src 'self'
: νλ₯ν μΆλ°μ μ λλ€. λͺ¨λ 리μμ€λ₯Ό λ¬Έμμ λμΌν μΆμ²μμλ§ λ‘λνλλ‘ μ νν©λλ€.script-src
: κ°μ₯ μ€μν μ§μλ¬Έμ λλ€. μλ°μ€ν¬λ¦½νΈμ μ ν¨ν μμ€λ₯Ό μ μν©λλ€.'unsafe-inline'
κ³Ό'unsafe-eval'
μ CSPμ λͺ©μ μλΉ λΆλΆμ 무λ ₯νμν€λ―λ‘ μ΄λ€ λκ°λ₯Ό μΉλ₯΄λλΌλ νΌν΄μΌ ν©λλ€. μΈλΌμΈ μ€ν¬λ¦½νΈμ κ²½μ°, λ Όμ€(nonce)(무μμ μΌνμ© κ°)λ ν΄μλ₯Ό μ¬μ©νμμμ€.connect-src
: νμ΄μ§κ°fetch()
λXMLHttpRequest
μ κ°μ APIλ₯Ό μ¬μ©νμ¬ μ°κ²°ν μ μλ μΆμ²λ₯Ό μ μ΄ν©λλ€. μ΄λ λ°μ΄ν° μ μΆμ λ°©μ§νλ λ° λ§€μ° μ€μν©λλ€.frame-ancestors
: μ΄ μ§μλ¬Έμ μ΄λ€ μΆμ²κ°<iframe>
μ νμ΄μ§λ₯Ό ν¬ν¨ν μ μλμ§ μ§μ νλ©°, ν΄λ¦μ¬νΉμ λ°©μ§νκΈ° μνX-Frame-Options
ν€λμ νλμ μ΄κ³ λ μ μ°ν λ체μ¬μ λλ€. μ΄λ₯Ό'none'
μ΄λ'self'
λ‘ μ€μ νλ κ²μ κ°λ ₯ν 보μ μ‘°μΉμ λλ€.- λ³΄κ³ :
report-uri
λreport-to
μ§μλ¬Έμ μ¬μ©νμ¬ CSP κ·μΉμ΄ μλ°λ λλ§λ€ μ§μ λ μλν¬μΈνΈλ‘ JSON λ³΄κ³ μλ₯Ό 보λ΄λλ‘ λΈλΌμ°μ μ μ§μν©λλ€. μ΄λ μλλ 곡격μ΄λ μλͺ»λ ꡬμ±μ λν κ·μ€ν μ€μκ° κ°μμ±μ μ 곡ν©λλ€.
2. νμ 리μμ€ λ¬΄κ²°μ±(SRI): μλνν° μ€ν¬λ¦½νΈ κ²μ¦
μλνν° μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN)μμ μ€ν¬λ¦½νΈλ₯Ό λ‘λν λ, λΉμ μ κ·Έ CDNμ΄ μμλμ§ μμλ€κ³ μ λ’°νλ κ²μ λλ€. νμ 리μμ€ λ¬΄κ²°μ±(SRI)μ λΈλΌμ°μ κ° κ°μ Έμ¨ νμΌμ΄ λΉμ μ΄ μλν λ°λ‘ κ·Έ νμΌμΈμ§ νμΈν μ μκ² ν¨μΌλ‘μ¨ μ΄ μ λ’° μꡬμ¬νμ μ κ±°ν©λλ€.
μλ λ°©μ: <script>
νκ·Έμ μμλλ μ€ν¬λ¦½νΈμ μνΈν ν΄μ(μ: SHA-384)λ₯Ό μ 곡ν©λλ€. λΈλΌμ°μ λ μ€ν¬λ¦½νΈλ₯Ό λ€μ΄λ‘λνκ³ μ체 ν΄μλ₯Ό κ³μ°ν ν λΉμ μ΄ μ 곡ν ν΄μμ λΉκ΅ν©λλ€. μΌμΉνμ§ μμΌλ©΄ λΈλΌμ°μ λ μ€ν¬λ¦½νΈ μ€νμ κ±°λΆν©λλ€.
ꡬν μμ:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK"
crossorigin="anonymous"></script>
SRIλ μΈλΆ λλ©μΈμμ λ‘λλλ λͺ¨λ 리μμ€μ λν νμμ μΈ μ μ΄μ λλ€. μ΄λ CDN μμμ΄ μ¬μ΄νΈμμ μ μ± μ½λ μ€νμΌλ‘ μ΄μ΄μ§λ κ²μ κ°λ ₯νκ² λ°©μ§ν©λλ€.
3. μ λ ₯κ° μ΄κ· λ° μΆλ ₯ μΈμ½λ©: XSS λ°©μ΄μ ν΅μ¬
CSPκ° κ°λ ₯ν μμ λ§μ΄κΈ΄ νμ§λ§, XSSμ λν κ·Όλ³Έμ μΈ λ°©μ΄λ μ¬μ©μ μ 곡 λ°μ΄ν°λ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬νλ λ° μμ΅λλ€. μ΄κ· (sanitization)κ³Ό μΈμ½λ©(encoding)μ ꡬλ³νλ κ²μ΄ μ€μν©λλ€.
- μ
λ ₯κ° μ΄κ· : μ΄λ μ¬μ©μ μ
λ ₯μ μλ²μ μ μ₯νκΈ° μ μ μ 리νκ±°λ νν°λ§νλ κ²μ ν¬ν¨ν©λλ€. λͺ©νλ μ μ¬μ μΌλ‘ μ
μμ μΈ λ¬Έμλ μ½λλ₯Ό μ κ±°νκ±°λ 무λ ₯ννλ κ²μ
λλ€. μλ₯Ό λ€μ΄,
<script>
νκ·Έλ₯Ό μ κ±°νλ κ²μ λλ€. κ·Έλ¬λ μ΄λ μ·¨μ½νκ³ μ°νλ μ μμ΅λλ€. μ£Όμ 보μ ν΅μ 보λ€λ λ°μ΄ν° νμμ κ°μ νλ λ°(μ: μ νλ²νΈμ μ«μλ§ ν¬ν¨λλλ‘ λ³΄μ₯) μ¬μ©νλ κ²μ΄ λ μ’μ΅λλ€. - μΆλ ₯ μΈμ½λ©: μ΄κ²μ΄ κ°μ₯ μ€μνκ³ μ λ’°ν μ μλ λ°©μ΄μ
λλ€. λ°μ΄ν°λ₯Ό HTML λ¬Έμμ λ λλ§νκΈ° μ§μ μ μ΄μ€μΌμ΄ννμ¬ λΈλΌμ°μ κ° μ΄λ₯Ό μ€ν κ°λ₯ν μ½λκ° μλ μΌλ° ν
μ€νΈλ‘ ν΄μνλλ‘ νλ κ²μ ν¬ν¨ν©λλ€. μΈμ½λ© 컨ν
μ€νΈκ° μ€μν©λλ€. μλ₯Ό λ€μ΄:
- HTML μμ(μ:
<div>
) λ΄μ λ°μ΄ν°λ₯Ό λ°°μΉν λλ HTML μΈμ½λ©μ ν΄μΌ ν©λλ€(μ:<
λ<
κ° λ¨). - HTML μμ±(μ:
value="..."
) λ΄μ λ°μ΄ν°λ₯Ό λ°°μΉν λλ μμ± μΈμ½λ©μ ν΄μΌ ν©λλ€. - μλ°μ€ν¬λ¦½νΈ λ¬Έμμ΄ λ΄μ λ°μ΄ν°λ₯Ό λ°°μΉν λλ μλ°μ€ν¬λ¦½νΈ μΈμ½λ©μ ν΄μΌ ν©λλ€.
- HTML μμ(μ:
λͺ¨λ² μ¬λ‘: μΉ νλ μμν¬μμ μ 곡νλ μ κ²μ¦λ νμ€ λΌμ΄λΈλ¬λ¦¬(μ: Pythonμ Jinja2, Rubyμ ERB, PHPμ Blade)λ₯Ό μΆλ ₯ μΈμ½λ©μ μ¬μ©νμμμ€. ν΄λΌμ΄μΈνΈ μΈ‘μμ μ λ’°ν μ μλ μμ€μ HTMLμ μμ νκ² μ²λ¦¬νλ €λ©΄ DOMPurifyμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμμμ€. μ λλ‘ μμ λ§μ μΈμ½λ©μ΄λ μ΄κ· 루ν΄μ λ§λ€λ €κ³ νμ§ λ§μμμ€.
4. 보μ ν€λ λ° μΏ ν€: HTTP κ³μΈ΅ κ°ν
λ§μ ν΄λΌμ΄μΈνΈ μΈ‘ μ·¨μ½μ μ 보μ HTTP ν€λμ μΏ ν€ μμ±μ ꡬμ±ν¨μΌλ‘μ¨ μνλ μ μμ΅λλ€. μ΄λ λΈλΌμ°μ κ° λ μ격ν 보μ μ μ± μ μννλλ‘ μ§μν©λλ€.
νμ HTTP ν€λ:
Strict-Transport-Security (HSTS)
: λΈλΌμ°μ κ° μλ²μ μ€μ§ HTTPSλ₯Ό ν΅ν΄μλ§ ν΅μ νλλ‘ μ§μνμ¬ νλ‘ν μ½ λ€μ΄κ·Έλ μ΄λ 곡격μ λ°©μ§ν©λλ€.X-Content-Type-Options: nosniff
: λΈλΌμ°μ κ° λ¦¬μμ€μ μ½ν μΈ μ νμ μΆμΈ‘(MIME-sniffing)νλ κ²μ λ°©μ§ν©λλ€. μ΄λ λ€λ₯Έ νμΌ μ νμΌλ‘ μμ₯ν μ€ν¬λ¦½νΈλ₯Ό μ€ννλ λ° μ μ©λ μ μμ΅λλ€.Referrer-Policy: strict-origin-when-cross-origin
: μμ²κ³Ό ν¨κ» μ μ‘λλ 리νΌλ¬ μ 보μ μμ μ μ΄νμ¬ λ―Όκ°ν URL λ°μ΄ν°κ° μλνν°μ μ μΆλλ κ²μ λ°©μ§ν©λλ€.
보μ μΏ ν€ μμ±:
HttpOnly
: μ΄λ λ§€μ° μ€μν μμ±μ λλ€. ν΄λΌμ΄μΈνΈ μΈ‘ μλ°μ€ν¬λ¦½νΈκ°document.cookie
APIλ₯Ό ν΅ν΄ μΏ ν€μ μ κ·Όν μ μκ² λ§λλλ€. μ΄κ²μ΄ XSSλ₯Ό ν΅ν μΈμ ν ν° λμ©μ λν μ£Όμ λ°©μ΄μ± μ λλ€.Secure
: λΈλΌμ°μ κ° μνΈνλ HTTPS μ°κ²°μ ν΅ν΄μλ§ μΏ ν€λ₯Ό μ μ‘νλλ‘ λ³΄μ₯ν©λλ€.SameSite
: CSRFμ λν κ°μ₯ ν¨κ³Όμ μΈ λ°©μ΄μ± μ λλ€. ν¬λ‘μ€ μ¬μ΄νΈ μμ²κ³Ό ν¨κ» μΏ ν€κ° μ μ‘λ μ§ μ¬λΆλ₯Ό μ μ΄ν©λλ€.SameSite=Strict
: μΏ ν€λ λμΌν μ¬μ΄νΈμμ μμλ μμ²μ λν΄μλ§ μ μ‘λ©λλ€. κ°μ₯ κ°λ ₯ν 보νΈλ₯Ό μ 곡ν©λλ€.SameSite=Lax
: μ’μ κ· νμ μ΄λ£Ήλλ€. μΏ ν€λ ν¬λ‘μ€ μ¬μ΄νΈ νμ μμ²(μ΄λ―Έμ§λ νλ μ λ±)μμλ 보λ₯λμ§λ§, μ¬μ©μκ° μΈλΆ μ¬μ΄νΈμμ URLλ‘ μ΄λν λ(μ: λ§ν¬ ν΄λ¦)λ μ μ‘λ©λλ€. λλΆλΆμ μ΅μ λΈλΌμ°μ μμ μ΄κ²μ΄ κΈ°λ³Έκ°μ λλ€.
5. μλνν° μμ‘΄μ± λ° κ³΅κΈλ§ 보μ κ΄λ¦¬
μ ν리μΌμ΄μ μ 보μμ κ°μ₯ μ½ν μμ‘΄μ±λ§νΌλ§ κ°λ ₯ν©λλ€. μκ³ μνμ§ npm ν¨ν€μ§μ μ·¨μ½μ μ΄ μ λ©΄μ μΈ μΉ¨ν΄λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
곡κΈλ§ 보μμ μν μ€ν κ°λ₯ν μ‘°μΉ:
- μλνλ μ·¨μ½μ μ€μΊ: GitHubμ Dependabot, Snyk, λλ `npm audit`κ³Ό κ°μ λꡬλ₯Ό CI/CD νμ΄νλΌμΈμ ν΅ν©νμμμ€. μ΄λ¬ν λꡬλ μλ €μ§ μ·¨μ½μ λ°μ΄ν°λ² μ΄μ€μ λΉκ΅νμ¬ μμ‘΄μ±μ μλμΌλ‘ μ€μΊνκ³ μνμ κ²½κ³ ν©λλ€.
- μ κΈ νμΌ(Lockfile) μ¬μ©: νμ μ κΈ νμΌ(
package-lock.json
,yarn.lock
)μ 리ν¬μ§ν 리μ 컀λ°νμμμ€. μ΄λ λͺ¨λ κ°λ°μμ λͺ¨λ λΉλ νλ‘μΈμ€κ° λͺ¨λ μμ‘΄μ±μ μ νν λμΌν λ²μ μ μ¬μ©νλλ‘ λ³΄μ₯νμ¬, μκΈ°μΉ μκ³ μ μ¬μ μΌλ‘ μ μμ μΈ μ λ°μ΄νΈλ₯Ό λ°©μ§ν©λλ€. - μμ‘΄μ± κ²ν : μλ‘μ΄ μμ‘΄μ±μ μΆκ°νκΈ° μ μ μ€μ¬λ₯Ό μννμμμ€. μΈκΈ°λ, μ μ§ κ΄λ¦¬ μν, μ΄μ μ΄λ ₯, 보μ μ€μ μ νμΈνμμμ€. μκ³ μ μ§ κ΄λ¦¬κ° λμ§ μλ λΌμ΄λΈλ¬λ¦¬λ λ리 μ¬μ©λκ³ νλ°νκ² μ§μλλ λΌμ΄λΈλ¬λ¦¬λ³΄λ€ λ ν° μνμ λλ€.
- μμ‘΄μ± μ΅μν: μμ‘΄μ±μ΄ μ μμλ‘ κ³΅κ²© νλ©΄μ΄ μμμ§λλ€. μ κΈ°μ μΌλ‘ νλ‘μ νΈλ₯Ό κ²ν νκ³ μ¬μ©νμ§ μλ ν¨ν€μ§λ₯Ό μ κ±°νμμμ€.
6. λ°νμ λ³΄νΈ λ° λͺ¨λν°λ§
μ μ λ°©μ΄λ νμμ μ΄μ§λ§, ν¬κ΄μ μΈ μ λ΅μλ μ¬μ©μ λΈλΌμ°μ μμ μ½λκ° μ€μκ°μΌλ‘ 무μμ νλμ§ λͺ¨λν°λ§νλ κ²λ ν¬ν¨λ©λλ€.
λ°νμ 보μ μ‘°μΉ:
- μλ°μ€ν¬λ¦½νΈ μλλ°μ±: μνλκ° λμ μλνν° μ½λλ₯Ό μ€νν λ(μ: μ¨λΌμΈ μ½λ νΈμ§κΈ°λ νλ¬κ·ΈμΈ μμ€ν ), μ격ν CSPκ° μ μ©λ μλλ°μ€ iframeκ³Ό κ°μ κΈ°μ μ μ¬μ©νμ¬ κ·Έλ€μ λ₯λ ₯μ ν¬κ² μ ννμμμ€.
- νλ κΈ°λ° λͺ¨λν°λ§: ν΄λΌμ΄μΈνΈ μΈ‘ 보μ μ루μ μ νμ΄μ§μ λͺ¨λ μ€ν¬λ¦½νΈμ λ°νμ λμμ λͺ¨λν°λ§ν μ μμ΅λλ€. λ―Όκ°ν μμ νλμ μ κ·Όνλ €λ μ€ν¬λ¦½νΈ, λ°μ΄ν° μ μΆμ λνλ΄λ μκΈ°μΉ μμ λ€νΈμν¬ μμ², λλ DOMμ λν λ¬΄λ¨ μμ κ³Ό κ°μ μμ¬μ€λ¬μ΄ νλμ μ€μκ°μΌλ‘ νμ§νκ³ μ°¨λ¨ν μ μμ΅λλ€.
- μ€μ μ§μ€μ λ‘κΉ : CSPμμ μΈκΈνλ―μ΄, ν΄λΌμ΄μΈνΈ μΈ‘μμ λ°μνλ 보μ κ΄λ ¨ μ΄λ²€νΈλ₯Ό μ§κ³νμμμ€. CSP μλ°, λ¬΄κ²°μ± κ²μ¬ μ€ν¨ λ° κΈ°ν μ΄μ μ§νλ₯Ό μ€μ μ§μ€μ 보μ μ 보 λ° μ΄λ²€νΈ κ΄λ¦¬(SIEM) μμ€ν μ λ‘κΉ νλ©΄ 보μνμ΄ μΆμΈλ₯Ό νμ νκ³ λκ·λͺ¨ 곡격μ νμ§ν μ μμ΅λλ€.
μ’ ν©: κ³μΈ΅μ λ°©μ΄ λͺ¨λΈ
λ¨ νλμ ν΅μ λ λ§λ³ν΅μΉμ½μ μλλλ€. μ΄ νλ μμν¬μ κ°μ μ μ΄λ¬ν λ°©μ΄λ€μ κ³μΈ΅ννμ¬ μλ‘λ₯Ό κ°ννλ λ° μμ΅λλ€.
- μν: μ¬μ©μ μμ± μ½ν
μΈ λ‘ μΈν XSS.
- 1κ³μΈ΅(μ£Όμ): 컨ν μ€νΈ μΈμ μΆλ ₯ μΈμ½λ©μ λΈλΌμ°μ κ° μ¬μ©μ λ°μ΄ν°λ₯Ό μ½λλ‘ ν΄μνλ κ²μ λ°©μ§ν©λλ€.
- 2κ³μΈ΅(보쑰): μ격ν μ½ν μΈ λ³΄μ μ μ± (CSP)μ μΈμ½λ© λ²κ·Έκ° μ‘΄μ¬νλλΌλ μΉμΈλμ§ μμ μ€ν¬λ¦½νΈμ μ€νμ λ°©μ§ν©λλ€.
- 3κ³μΈ΅(3μ°¨):
HttpOnly
μΏ ν€λ₯Ό μ¬μ©νλ©΄ λλλΉν μΈμ ν ν°μ΄ 곡격μμκ² μ μ©νμ§ μκ² λ©λλ€.
- μν: μμλ μλνν° λΆμ μ€ν¬λ¦½νΈ.
- 1κ³μΈ΅(μ£Όμ): νμ 리μμ€ λ¬΄κ²°μ±(SRI)μ λΈλΌμ°μ κ° μμ λ μ€ν¬λ¦½νΈμ λ‘λ©μ μ°¨λ¨νκ² ν©λλ€.
- 2κ³μΈ΅(보쑰): νΉμ
script-src
λ°connect-src
λ₯Ό κ°μ§ μ격ν CSPλ μμλ μ€ν¬λ¦½νΈκ° ν μ μλ μΌκ³Ό λ°μ΄ν°λ₯Ό λ³΄λΌ μ μλ κ³³μ μ νν©λλ€. - 3κ³μΈ΅(3μ°¨): λ°νμ λͺ¨λν°λ§μ μ€ν¬λ¦½νΈμ λΉμ μμ μΈ νλ(μ: λΉλ°λ²νΈ νλ μ½κΈ° μλ)μ κ°μ§νκ³ μ°¨λ¨ν μ μμ΅λλ€.
κ²°λ‘ : μ§μμ μΈ λ³΄μμ λν μ½μ
ν΄λΌμ΄μΈνΈ μΈ‘ μλ°μ€ν¬λ¦½νΈλ₯Ό 보νΈνλ κ²μ μΌνμ± νλ‘μ νΈκ° μλλλ€. κ·Έκ²μ κ²½κ³, μ μ, κ°μ μ μ§μμ μΈ κ³Όμ μ λλ€. μν νκ²½μ λμμμ΄ μ§ννλ©°, 곡격μλ€μ λ°©μ΄μ± μ μ°ννκΈ° μν μλ‘μ΄ κΈ°μ μ κ°λ°ν©λλ€. 건μ ν μμΉ μμ ꡬμΆλ ꡬ쑰νλ λ€κ³μΈ΅ νλ μμν¬λ₯Ό μ±νν¨μΌλ‘μ¨, λΉμ μ μ¬ν λμμ μΈ μμΈμμ μ μ μ μΈ μμΈλ‘ μ ννκ² λ©λλ€.
CSPμ κ°μ κ°λ ₯ν μ μ± , SRIλ₯Ό ν΅ν κ²μ¦, μΈμ½λ©κ³Ό κ°μ κΈ°λ³Έ μμ, 보μ ν€λλ₯Ό ν΅ν κ°ν, μμ‘΄μ± μ€μΊ λ° λ°νμ λͺ¨λν°λ§μ ν΅ν κ²½κ³λ₯Ό κ²°ν©ν μ΄ νλ μμν¬λ μ μΈκ³ μ‘°μ§μ μν κ²¬κ³ ν μ²μ¬μ§μ μ 곡ν©λλ€. μ€λλΆν° μ΄λ¬ν μ μ΄μ λν΄ μ ν리μΌμ΄μ μ κ°μ¬νκΈ° μμνμμμ€. μ μ λ μνΈ μ°κ²°λλ μΈμμμ λ°μ΄ν°, μ¬μ©μ, κ·Έλ¦¬κ³ λͺ μ±μ 보νΈνκΈ° μν΄ μ΄λ¬ν κ³μΈ΅μ λ°©μ΄μ ꡬνμ μ°μ μμλ‘ μΌμΌμμμ€.