μΉ μ½ν μΈ λ³΄μ μ μ± (CSP)μ λν ν¬κ΄μ μΈ κ°μ΄λλ‘, XSS 곡격 λ°©μ§ λ° μΉ μ ν리μΌμ΄μ μ μ€ν¬λ¦½νΈ μ€ν μ μ΄λ₯Ό μν μμΉ, ꡬν, μ§μΉ¨ λ° λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
μΉ μ½ν μΈ λ³΄μ μ μ± : XSSλ‘λΆν° μΉμ¬μ΄νΈ κ°ν λ° μ€ν¬λ¦½νΈ μ€ν μ μ΄
μ€λλ μ μνΈ μ°κ²°λ λμ§νΈ νκ²½μμ μΉ λ³΄μμ λ§€μ° μ€μν©λλ€. μΉμ¬μ΄νΈμ μΉ μ ν리μΌμ΄μ μ λμμμ΄ μνμ μ§λ©΄νκ³ μμΌλ©°, ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) 곡격μ μ¬μ ν ββμ€μν λ¬Έμ μ λλ€. μΉ μ½ν μΈ λ³΄μ μ μ± (CSP)μ κ°λ ₯ν λ°©μ΄ λ©μ»€λμ¦μ μ 곡νμ¬ κ°λ°μκ° λΈλΌμ°μ κ° λ‘λν μ μλ 리μμ€λ₯Ό μ μ΄ν μ μλλ‘ νμ¬ XSSμ μνμ μννκ³ μ λ°μ μΈ μΉ λ³΄μμ κ°νν©λλ€.
μΉ μ½ν μΈ λ³΄μ μ μ± (CSP)μ΄λ 무μμΈκ°μ?
CSPλ μΉμ¬μ΄νΈ κ΄λ¦¬μκ° μ£Όμ΄μ§ νμ΄μ§μ λν΄ μ¬μ©μ μμ΄μ νΈκ° λ‘λν μ μλ 리μμ€λ₯Ό μ μ΄ν μ μλλ‘ νλ 보μ νμ€μ λλ€. λ³Έμ§μ μΌλ‘ λΈλΌμ°μ κ° μ λ’°ν μ μλ μμ€μ νμ΄νΈλ¦¬μ€νΈλ₯Ό μ 곡νμ¬ μ λ’°ν μ μλ μμ€μ λͺ¨λ μ½ν μΈ λ₯Ό μ°¨λ¨ν©λλ€. μ΄λ XSS μ·¨μ½μ± λ° κΈ°ν μ νμ μ½λ μ£Όμ 곡격μ λν 곡격 νλ©΄μ ν¬κ² μ€μ λλ€.
CSPλ₯Ό μΉ νμ΄μ§μ λ°©νλ²½μΌλ‘ μκ°νμμμ€. λ‘λν μ μλ 리μμ€(μ: μ€ν¬λ¦½νΈ, μ€νμΌμνΈ, μ΄λ―Έμ§, κΈκΌ΄ λ° νλ μ)μ μ’ λ₯μ λ‘λν μμΉλ₯Ό μ§μ ν©λλ€. λΈλΌμ°μ κ° μ μλ μ μ± κ³Ό μΌμΉνμ§ μλ 리μμ€λ₯Ό κ°μ§νλ©΄ ν΄λΉ 리μμ€μ λ‘λλ₯Ό μ°¨λ¨νμ¬ μ μ¬μ μΌλ‘ μ μ± μ½λκ° μ€νλλ κ²μ λ°©μ§ν©λλ€.
CSPκ° μ€μν μ΄μ λ 무μμΈκ°μ?
- XSS 곡격 μν: CSPλ μ£Όλ‘ κ³΅κ²©μκ° μ μ± μ€ν¬λ¦½νΈλ₯Ό μΉμ¬μ΄νΈμ μ£Όμ νμ¬ μ¬μ©μ λ°μ΄ν°λ₯Ό νμΉκ±°λ, μΈμ μ νμ΄μ¬νΉνκ±°λ, μ¬μ΄νΈλ₯Ό λ³μ‘°ν μ μλλ‘ νλ XSS 곡격μ λ°©μ§νλλ‘ μ€κ³λμμ΅λλ€.
- μ·¨μ½μ±μ μν₯ κ°μ: μΉμ¬μ΄νΈμ XSS μ·¨μ½μ±μ΄ μλ κ²½μ°μλ CSPλ μ μ± μ€ν¬λ¦½νΈ μ€νμ λ°©μ§νμ¬ κ³΅κ²©μ μν₯μ ν¬κ² μ€μΌ μ μμ΅λλ€.
- μ¬μ©μ κ°μΈ μ 보 λ³΄νΈ κ°ν: CSPλ λΈλΌμ°μ κ° λ‘λν μ μλ 리μμ€λ₯Ό μ μ΄ν¨μΌλ‘μ¨ μΆμ μ€ν¬λ¦½νΈ λλ κΈ°ν κ°μΈ μ 보λ₯Ό μΉ¨ν΄νλ μ½ν μΈ μ μ£Όμ μ λ°©μ§νμ¬ μ¬μ©μ κ°μΈ μ 보λ₯Ό 보νΈνλ λ° λμμ΄ λ μ μμ΅λλ€.
- μΉμ¬μ΄νΈ μ±λ₯ ν₯μ: CSPλ λΆνμνκ±°λ μ μ± λ¦¬μμ€μ λ‘λλ₯Ό λ°©μ§νμ¬ λμν μλΉλ₯Ό μ€μ΄κ³ νμ΄μ§ λ‘λ μκ°μ κ°μ νμ¬ μΉμ¬μ΄νΈ μ±λ₯μ ν₯μμν¬ μλ μμ΅λλ€.
- μ¬μΈ΅ λ°©μ΄ μ 곡: CSPλ μ¬μΈ΅ λ°©μ΄ μ λ΅μ νμ κ΅¬μ± μμλ‘, λ€μν μνμΌλ‘λΆν° 보νΈνκΈ° μν΄ μΆκ° 보μ κ³μΈ΅μ μ 곡ν©λλ€.
CSPλ μ΄λ»κ² μλνλμ?
CSPλ μΉ μλ²μμ λΈλΌμ°μ λ‘ HTTP μλ΅ ν€λλ₯Ό μ μ‘νμ¬ κ΅¬νλ©λλ€. ν€λμλ λ€μν μ νμ 리μμ€μ νμ©λλ μμ€λ₯Ό μ§μ νλ μ μ± μ΄ ν¬ν¨λμ΄ μμ΅λλ€. κ·Έλ¬λ©΄ λΈλΌμ°μ λ μ΄ μ μ± μ μ μ©νμ¬ μ€μνμ§ μλ λͺ¨λ 리μμ€λ₯Ό μ°¨λ¨ν©λλ€.
CSP μ μ±
μ μΌλ ¨μ μ§μλ¬Έμ μ¬μ©νμ¬ μ μλλ©°, κ° μ§μλ¬Έμ νΉμ μ νμ 리μμ€μ νμ©λλ μμ€λ₯Ό μ§μ ν©λλ€. μλ₯Ό λ€μ΄ script-src
μ§μλ¬Έμ JavaScript μ½λμ νμ©λλ μμ€λ₯Ό μ§μ νκ³ style-src
μ§μλ¬Έμ CSS μ€νμΌμνΈμ νμ©λλ μμ€λ₯Ό μ§μ ν©λλ€.
λ€μμ CSP ν€λμ λ¨μνλ μμ λλ€.
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' 'unsafe-inline';
μ΄ μ μ± μ λμΌν μΆμ²('self')μ 리μμ€, λμΌν μΆμ² λ° https://example.comμ μ€ν¬λ¦½νΈ, λμΌν μΆμ² λ° μΈλΌμΈ μ€νμΌ('unsafe-inline')μ μ€νμΌμ νμ©ν©λλ€.
CSP μ§μΉ¨: μμΈν κ°μ
CSP μ§μΉ¨μ CSP μ μ± μ λΉλ© λΈλ‘μ λλ€. λ€μν μ νμ 리μμ€μ νμ©λλ μμ€λ₯Ό μ§μ ν©λλ€. λ€μμ κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ μ§μΉ¨μ λν λΆμμ λλ€.
default-src
: νΉμ μ§μΉ¨μ΄ μ μλμ§ μμ κ²½μ° λͺ¨λ 리μμ€ μ νμ λν κΈ°λ³Έ μμ€λ₯Ό μ§μ ν©λλ€. μ΄λ κΈ°λ³Έ 보μ μμΈλ₯Ό μ€μ νλ λ° μ€μν μ§μΉ¨μ λλ€.script-src
: JavaScript μ½λλ₯Ό λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€. μ΄λ XSS 곡격μ λ°©μ§νλ λ° κ°μ₯ μ€μν μ§μΉ¨ μ€ νλμ λλ€.style-src
: CSS μ€νμΌμνΈλ₯Ό λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€. μ΄ μ§μΉ¨μ XSS 곡격μ λ°©μ§νλ λ° λμμ΄ λλ©° CSS μ£Όμ 곡격μ μνμ μνν μ μμ΅λλ€.img-src
: μ΄λ―Έμ§λ₯Ό λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€.font-src
: κΈκΌ΄μ λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€.media-src
: λ―Έλμ΄ νμΌ(μ: μ€λμ€ λ° λΉλμ€)μ λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€.object-src
: νλ¬κ·ΈμΈ(μ: Flash)μ λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€. μ°Έκ³ : 보μ λ¬Έμ λ‘ μΈν΄ νλ¬κ·ΈμΈ μ¬μ©μ μΌλ°μ μΌλ‘ κΆμ₯λμ§ μμ΅λλ€.frame-src
: νλ μ λ° iframeμ λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€. μ΄ μ§μΉ¨μ ν΄λ¦μ¬νΉ 곡격μ λ°©μ§νκ³ νλ μ λ΄ XSS 곡격μ λ²μλ₯Ό μ ννλ λ° λμμ΄ λ©λλ€.connect-src
: μ€ν¬λ¦½νΈκ°XMLHttpRequest
,WebSocket
,EventSource
λ±μ μ¬μ©νμ¬ μ°κ²°ν μ μλ URLμ μ μ΄ν©λλ€. μ΄ μ§μΉ¨μ μΉ μ ν리μΌμ΄μ μμ μμλ°μ΄λ λ€νΈμν¬ μ°κ²°μ μ μ΄νλ λ° μ€μν©λλ€.base-uri
:<base>
μμμμ μ¬μ©ν μ μλ URLμ μ νν©λλ€.form-action
: μμμ μ μΆν μ μλ URLμ μ νν©λλ€.upgrade-insecure-requests
: λΈλΌμ°μ μ μμ νμ§ μμ HTTP μμ²μ HTTPSλ‘ μλ μ κ·Έλ μ΄λνλλ‘ μ§μν©λλ€. μ΄λ κ² νλ©΄ λΈλΌμ°μ μ μλ² κ°μ λͺ¨λ ν΅μ μ΄ μνΈνλλλ‘ νλ λ° λμμ΄ λ©λλ€.block-all-mixed-content
: λΈλΌμ°μ κ° νΌν©λ μ½ν μΈ (HTTPS νμ΄μ§μ HTTP μ½ν μΈ )λ₯Ό λ‘λνμ§ λͺ»νλλ‘ ν©λλ€. μ΄λ κ² νλ©΄ λͺ¨λ 리μμ€κ° HTTPSλ₯Ό ν΅ν΄ λ‘λλλλ‘ νμ¬ λ³΄μμ λμ± κ°νν©λλ€.report-uri
: CSP μλ°μ΄ λ°μν λ λΈλΌμ°μ κ° λ³΄κ³ μλ₯Ό 보λ΄μΌ νλ URLμ μ§μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ CSP μ μ± μ λͺ¨λν°λ§νκ³ μ μ¬μ μΈ μ·¨μ½μ±μ μλ³ν μ μμ΅λλ€. μ°Έκ³ : μ΄ μ§μΉ¨μreport-to
λ₯Ό μ νΈνμ¬ λ μ΄μ μ¬μ©λμ§ μμ΅λλ€.report-to
: CSP μλ° λ³΄κ³ μλ₯Ό 보λ΄μΌ νλ μμΉλ₯Ό μ μνλReport-To
ν€λμ μ μλ κ·Έλ£Ή μ΄λ¦μ μ§μ ν©λλ€. μ΄λ CSP μλ° λ³΄κ³ μλ₯Ό λ°λ λ° μ νΈλλ λ°©λ²μ λλ€.
μμ€ λͺ©λ‘ κ°
κ° μ§μΉ¨μ μμ€ λͺ©λ‘μ μ¬μ©νμ¬ νμ©λλ μμ€λ₯Ό μ§μ ν©λλ€. μμ€ λͺ©λ‘μλ λ€μ κ°μ΄ ν¬ν¨λ μ μμ΅λλ€.
'self'
: λμΌν μΆμ²(μ€ν€λ§ λ° νΈμ€νΈ)μ 리μμ€λ₯Ό νμ©ν©λλ€.'none'
: λͺ¨λ μμ€μ 리μμ€λ₯Ό νμ©νμ§ μμ΅λλ€.'unsafe-inline'
: μΈλΌμΈ JavaScript λ° CSS μ¬μ©μ νμ©ν©λλ€. μ°Έκ³ : XSS 곡격μ μνμ μ¦κ°μν¬ μ μμΌλ―λ‘ κ°λ₯ν ν νΌν΄μΌ ν©λλ€.'unsafe-eval'
:eval()
λ° μ μ¬ν ν¨μ μ¬μ©μ νμ©ν©λλ€. μ°Έκ³ : XSS 곡격μ μνμ μ¦κ°μν¬ μ μμΌλ―λ‘ κ°λ₯ν ν νΌν΄μΌ ν©λλ€.'strict-dynamic'
: nonce λλ ν΄μμ ν¨κ» μ 곡νμ¬ νμμ μλ μ€ν¬λ¦½νΈμ λͺ μμ μΌλ‘ λΆμ¬λ μ λ’°κ° ν΄λΉ μμ μμμ μν΄ λ‘λλ λͺ¨λ μ€ν¬λ¦½νΈλ‘ μ νλλλ‘ μ§μ ν©λλ€.'nonce-{random-value}'
: μΌμΉνλnonce
μμ±μ΄ μλ μ€ν¬λ¦½νΈλ₯Ό νμ©ν©λλ€.{random-value}
λ κ° μμ²μ λν΄ μμ±λ μνΈν λ°©μμΌλ‘ 무μμ λ¬Έμμ΄μ΄μ΄μΌ ν©λλ€.'sha256-{hash-value}'
,'sha384-{hash-value}'
,'sha512-{hash-value}'
: μΌμΉνλ ν΄μκ° μλ μ€ν¬λ¦½νΈλ₯Ό νμ©ν©λλ€.{hash-value}
λ μ€ν¬λ¦½νΈμ base64λ‘ μΈμ½λ©λ SHA-256, SHA-384 λλ SHA-512 ν΄μμ¬μΌ ν©λλ€.https://example.com
: νΉμ λλ©μΈμ 리μμ€λ₯Ό νμ©ν©λλ€.*.example.com
: νΉμ λλ©μΈμ λͺ¨λ νμ λλ©μΈμ 리μμ€λ₯Ό νμ©ν©λλ€.
CSP ꡬν: λ¨κ³λ³ κ°μ΄λ
CSPλ₯Ό ꡬννλ €λ©΄ μ μ± μ μ μν λ€μ μΉ μλ²μ λ°°ν¬ν΄μΌ ν©λλ€. λ€μμ λ¨κ³λ³ κ°μ΄λμ λλ€.
- μΉμ¬μ΄νΈ λΆμ: λ¨Όμ μΉμ¬μ΄νΈλ₯Ό λΆμνμ¬ μ€ν¬λ¦½νΈ, μ€νμΌμνΈ, μ΄λ―Έμ§, κΈκΌ΄ λ° νλ μμ ν¬ν¨νμ¬ λ‘λνλ λͺ¨λ 리μμ€λ₯Ό μλ³ν©λλ€. CDN λ° μμ λ―Έλμ΄ μμ ―κ³Ό κ°μ νμ¬ λ¦¬μμ€μ μ£ΌμνμΈμ.
- μ μ± μ μ: λΆμμ κΈ°λ°μΌλ‘ νμ 리μμ€λ§ νμ©νλ CSP μ μ± μ μ μν©λλ€. μ νμ μΈ μ μ± μΌλ‘ μμνμ¬ νμμ λ°λΌ μ μ°¨μ μΌλ‘ μνν©λλ€. μμ μ€λͺ λ μ§μΉ¨μ μ¬μ©νμ¬ κ° λ¦¬μμ€ μ νμ νμ©λλ μμ€λ₯Ό μ§μ ν©λλ€.
- μ μ±
λ°°ν¬: μΉ μλ²μμ
Content-Security-Policy
HTTP ν€λλ₯Ό μ μ‘νμ¬ CSP μ μ± μ λ°°ν¬ν©λλ€.<meta>
νκ·Έλ₯Ό μ¬μ©νμ¬ μ μ± μ μ μν μλ μμ§λ§ μ΄λ 보μμ΄ λ¨μ΄μ§ μ μμΌλ―λ‘ μΌλ°μ μΌλ‘ κΆμ₯λμ§ μμ΅λλ€. - μ μ± ν μ€νΈ: CSP μ μ± μ΄ μΉμ¬μ΄νΈμ κΈ°λ₯μ μμμν€μ§ μλμ§ μ² μ νκ² ν μ€νΈν©λλ€. λΈλΌμ°μ μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ λͺ¨λ CSP μλ°μ μλ³νκ³ κ·Έμ λ°λΌ μ μ± μ μ‘°μ ν©λλ€.
- μ μ±
λͺ¨λν°λ§: μ μ¬μ μΈ μ·¨μ½μ±μ μλ³νκ³ ν¨κ³Όμ μΈ μνλ₯Ό μ μ§νκΈ° μν΄ CSP μ μ±
μ μ κΈ°μ μΌλ‘ λͺ¨λν°λ§ν©λλ€.
report-uri
λλreport-to
μ§μΉ¨μ μ¬μ©νμ¬ CSP μλ° λ³΄κ³ μλ₯Ό λ°μ΅λλ€.
λ°°ν¬ λ°©λ²
CSPλ λ κ°μ§ μ£Όμ λ°©λ²μ μ¬μ©νμ¬ λ°°ν¬ν μ μμ΅λλ€.
- HTTP ν€λ: μ νΈνλ λ°©λ²μ
Content-Security-Policy
HTTP ν€λλ₯Ό μ¬μ©νλ κ²μ λλ€. μ΄λ κ² νλ©΄ νμ΄μ§κ° λ λλ§λκΈ° μ μ λΈλΌμ°μ μμ μ μ± μ μ μ©ν μ μμΌλ―λ‘ λ λμ 보μμ μ 곡ν©λλ€. <meta>
νκ·Έ: HTML λ¬Έμμ<head>
μΉμ μμ<meta>
νκ·Έλ₯Ό μ¬μ©ν μλ μμ΅λλ€. κ·Έλ¬λ μ΄ λ°©λ²μ νμ΄μ§κ° ꡬ문 λΆμλ λκΉμ§ μ μ± μ΄ μ μ©λμ§ μμΌλ―λ‘ μΌλ°μ μΌλ‘ λ μμ ν©λλ€.
λ€μμ HTTP ν€λλ₯Ό μ¬μ©νμ¬ CSPλ₯Ό λ°°ν¬νλ μμ λλ€.
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';
λ€μμ <meta>
νκ·Έλ₯Ό μ¬μ©νμ¬ CSPλ₯Ό λ°°ν¬νλ μμ
λλ€.
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';">
λ³΄κ³ μ μ© λͺ¨λμ CSP
CSPλ λν μ μ± μ μ€μ λ‘ μ μ©νμ§ μκ³ ν μ€νΈν μ μλ λ³΄κ³ μ μ© λͺ¨λλ₯Ό μ§μν©λλ€. λ³΄κ³ μ μ© λͺ¨λμμλ λΈλΌμ°μ κ° λͺ¨λ CSP μλ°μ λ³΄κ³ νμ§λ§ 리μμ€ λ‘λλ₯Ό μ°¨λ¨νμ§ μμ΅λλ€. μ΄λ νλ‘λμ μ λ°°ν¬νκΈ° μ μ μ μ± μ ν μ€νΈνκ³ κ°μ νλ λ° μ μ©ν λꡬμ λλ€.
λ³΄κ³ μ μ© λͺ¨λλ₯Ό νμ±ννλ €λ©΄ Content-Security-Policy-Report-Only
HTTP ν€λλ₯Ό μ¬μ©ν©λλ€.
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://cdn.example.com; report-uri /csp-report;
μ΄ μμμ λΈλΌμ°μ λ CSP μλ° λ³΄κ³ μλ₯Ό /csp-report
μλν¬μΈνΈλ‘ 보λ΄μ§λ§ 리μμ€ λ‘λλ₯Ό μ°¨λ¨νμ§ μμ΅λλ€.
CSP ꡬνμ μν λͺ¨λ² μ¬λ‘
λ€μμ CSPλ₯Ό ꡬννκΈ° μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘μ λλ€.
- μ νμ μΈ μ μ± μΌλ‘ μμ: μ νμ μΈ μ μ± μΌλ‘ μμνμ¬ νμμ λ°λΌ μ μ°¨μ μΌλ‘ μνν©λλ€. μ΄λ κ² νλ©΄ μ μ¬μ μΈ μ·¨μ½μ±μ μλ³νκ³ μ μ± μ΄ κ°λ₯ν ν ν¨κ³Όμ μΈμ§ νμΈν μ μμ΅λλ€.
- κ°λ₯ν ν
'self'
μ¬μ©: κ°λ₯ν ν λμΌν μΆμ²μ 리μμ€λ₯Ό νμ©ν©λλ€. μ΄λ κ² νλ©΄ 곡격 νλ©΄μ΄ μ€μ΄λ€κ³ μ μ± μ λ μ½κ² κ΄λ¦¬ν μ μμ΅λλ€. 'unsafe-inline'
λ°'unsafe-eval'
λ°©μ§: μ λμ μΌλ‘ νμν κ²½μ°κ° μλλ©΄'unsafe-inline'
λ°'unsafe-eval'
μ μ¬μ©νμ§ λ§μΈμ. μ΄λ¬ν μ§μΉ¨μ XSS 곡격μ μνμ ν¬κ² μ¦κ°μν΅λλ€.- μΈλΌμΈ μ€ν¬λ¦½νΈ λ° μ€νμΌμ nonce λλ ν΄μ μ¬μ©: μΈλΌμΈ μ€ν¬λ¦½νΈ λλ μ€νμΌμ μ¬μ©ν΄μΌ νλ κ²½μ° nonce λλ ν΄μλ₯Ό μ¬μ©νμ¬ μΉμΈλ μ½λλ§ μ€νλλλ‘ ν©λλ€.
- μ μ± μ μ κΈ°μ μΌλ‘ λͺ¨λν°λ§: μ μ¬μ μΈ μ·¨μ½μ±μ μλ³νκ³ ν¨κ³Όμ μΈ μνλ₯Ό μ μ§νκΈ° μν΄ CSP μ μ± μ μ κΈ°μ μΌλ‘ λͺ¨λν°λ§ν©λλ€.
- CSP λ³΄κ³ λꡬ μ¬μ©: CSP μλ° λ³΄κ³ μλ₯Ό μμ§νκ³ λΆμνκΈ° μν΄ CSP λ³΄κ³ λꡬλ₯Ό μ¬μ©ν©λλ€. μ΄λ κ² νλ©΄ μ μ¬μ μΈ μ·¨μ½μ±μ μλ³νκ³ μ μ± μ κ°μ νλ λ° λμμ΄ λ©λλ€.
- CSP μμ±κΈ° μ¬μ© κ³ λ €: μ¬λ¬ μ¨λΌμΈ λꡬλ₯Ό μ¬μ©νλ©΄ μΉμ¬μ΄νΈμ 리μμ€μ λ°λΌ CSP μ μ± μ μμ±ν μ μμ΅λλ€.
- μ μ± λ¬Έμν: CSP μ μ± μ λ¬Έμννμ¬ μ΄ν΄νκ³ μ μ§ κ΄λ¦¬νκΈ° μ½κ² λ§λλλ€.
μΌλ°μ μΈ CSP μ€μ λ° λ°©μ§ λ°©λ²
CSPλ₯Ό ꡬννλ κ²μ μ΄λ €μΈ μ μμΌλ©° 보μ μμΈλ₯Ό μ½νμν¬ μ μλ μ€μλ₯Ό μ½κ² μ μ§λ₯Ό μ μμ΅λλ€. λ€μμ λͺ κ°μ§ μΌλ°μ μΈ μ€μμ μ΄λ₯Ό λ°©μ§νλ λ°©λ²μ λλ€.
- κ³Όλνκ² νμ©μ μΈ μ μ± μ¬μ©: λͺ¨λ μμ€μ 리μμ€λ₯Ό νμ©νλ κ³Όλνκ² νμ©μ μΈ μ μ± μ μ¬μ©νμ§ λ§μμμ€. μ΄λ κ² νλ©΄ CSPμ λͺ©μ μ λ¬μ±ν μ μμΌλ©° XSS 곡격μ μνμ μ¦κ°μν¬ μ μμ΅λλ€.
- μ€μν μ§μΉ¨ ν¬ν¨ λλ½: μΉμ¬μ΄νΈμμ λ‘λνλ λͺ¨λ 리μμ€λ₯Ό ν¬ν¨νλλ‘ νμν λͺ¨λ μ§μΉ¨μ ν¬ν¨ν΄μΌ ν©λλ€.
- μ μ± μ μ² μ νκ² ν μ€νΈνμ§ μμ: μΉμ¬μ΄νΈμ κΈ°λ₯μ μμμν€μ§ μλλ‘ μ μ± μ μ² μ νκ² ν μ€νΈν©λλ€.
- μ μ± μ μ κΈ°μ μΌλ‘ λͺ¨λν°λ§νμ§ μμ: μ μ¬μ μΈ μ·¨μ½μ±μ μλ³νκ³ ν¨κ³Όμ μΈ μνλ₯Ό μ μ§νκΈ° μν΄ CSP μ μ± μ μ κΈ°μ μΌλ‘ λͺ¨λν°λ§ν©λλ€.
- CSP μλ° λ³΄κ³ λ¬΄μ: CSP μλ° λ³΄κ³ μ μ£Όμλ₯Ό κΈ°μΈμ΄κ³ μ΄λ₯Ό μ¬μ©νμ¬ μ μ± μ κ°μ ν©λλ€.
- λ μ΄μ μ¬μ©λμ§ μλ μ§μΉ¨ μ¬μ©:
report-uri
μ κ°μ λ μ΄μ μ¬μ©λμ§ μλ μ§μΉ¨μ μ¬μ©νμ§ λ§μμμ€. λμreport-to
λ₯Ό μ¬μ©νμμμ€.
CSP λ° νμ¬ λ¦¬μμ€
CDN, μμ λ―Έλμ΄ μμ ― λ° λΆμ μ€ν¬λ¦½νΈμ κ°μ νμ¬ λ¦¬μμ€λ μμλ κ²½μ° μλΉν 보μ μνμ μ΄λν μ μμ΅λλ€. CSPλ μ΄λ¬ν 리μμ€λ₯Ό λ‘λν μ μλ μμ€λ₯Ό μ μ΄νμ¬ μ΄ μνμ μννλ λ° λμμ΄ λ μ μμ΅λλ€.
νμ¬ λ¦¬μμ€λ₯Ό μ¬μ©νλ κ²½μ° λ€μμ νμΈνμμμ€.
- μ λ’°ν μ μλ μμ€μμλ§ λ¦¬μμ€ λ‘λ: κ°λ ₯ν 보μ μ€μ μ κ°μ§ μ λ’°ν μ μλ μμ€μμλ§ λ¦¬μμ€λ₯Ό λ‘λν©λλ€.
- νΉμ URL μ¬μ©: μμΌλμΉ΄λ λλ©μΈ λμ νΉμ URLμ μ¬μ©νμ¬ μ μ± λ²μλ₯Ό μ νν©λλ€.
- Subresource Integrity(SRI) μ¬μ© κ³ λ €: SRIλ₯Ό μ¬μ©νλ©΄ μμ μ½ν μΈ μ ν΄μλ₯Ό μ§μ νμ¬ νμ¬ λ¦¬μμ€μ 무결μ±μ νμΈν μ μμ΅λλ€.
κ³ κΈ CSP κΈ°μ
κΈ°λ³Έ CSP μ μ± μ μ€μ ν νμλ 보μ μμΈλ₯Ό λμ± κ°ννκΈ° μν΄ λ κ³ κΈ κΈ°μ μ νμν μ μμ΅λλ€.
- μΈλΌμΈ μ€ν¬λ¦½νΈ λ° μ€νμΌμ nonce μ¬μ©: Nonceλ κ° μμ²μ λν΄ μμ±λλ μνΈν λ°©μμΌλ‘ 무μμ κ°μ λλ€. 보μμ μμμν€μ§ μκ³ μΈλΌμΈ μ€ν¬λ¦½νΈ λ° μ€νμΌμ νμ©νλ λ° μ¬μ©ν μ μμ΅λλ€.
- μΈλΌμΈ μ€ν¬λ¦½νΈ λ° μ€νμΌμ ν΄μ μ¬μ©: ν΄μλ λͺ¨λ μΈλΌμΈ μ½λλ₯Ό νμ©νμ§ μκ³ νΉμ μΈλΌμΈ μ€ν¬λ¦½νΈ λ° μ€νμΌμ νμ©νλ λ° μ¬μ©ν μ μμ΅λλ€.
'strict-dynamic'
μ¬μ©:'strict-dynamic'
μ λΈλΌμ°μ μμ μ λ’°νλ μ€ν¬λ¦½νΈκ° CSP μ μ± μ λͺ μμ μΌλ‘ νμ΄νΈλ¦¬μ€νΈμ ν¬ν¨λμ§ μμ κ²½μ°μλ λ€λ₯Έ μ€ν¬λ¦½νΈλ₯Ό λ‘λνλλ‘ νμ©ν©λλ€.nonce
λ°hash
μμ±μ΄ μλ CSP λ©ν νκ·Έ μ¬μ©: `nonce` λ° `hash` μμ±μ CSP λ©ν νκ·Έ μ½ν μΈ μ μ§μ μ μ©νλ©΄ 보μμ κ°ννκ³ μ μ± μ΄ μ격νκ² μ μ©λλλ‘ ν μ μμ΅λλ€.
CSP λꡬ λ° λ¦¬μμ€
CSPλ₯Ό ꡬννκ³ κ΄λ¦¬νλ λ° λμμ΄ λλ λͺ κ°μ§ λꡬμ 리μμ€κ° μμ΅λλ€.
- CSP μμ±κΈ°: μΉμ¬μ΄νΈμ 리μμ€μ λ°λΌ CSP μ μ± μ μμ±νλ λ° λμμ΄ λλ μ¨λΌμΈ λꡬμ λλ€. μλ‘λ CSP μμ±κΈ° λ° Report URIμ CSP μμ±κΈ°κ° μμ΅λλ€.
- CSP λΆμκΈ°: μΉμ¬μ΄νΈλ₯Ό λΆμνκ³ μ μ¬μ μΈ CSP μ·¨μ½μ±μ μλ³νλ λꡬμ λλ€.
- CSP λ³΄κ³ λꡬ: CSP μλ° λ³΄κ³ μλ₯Ό μμ§νκ³ λΆμνλ λꡬμ λλ€. Report URIλ λ리 μ¬μ©λλ μμ λλ€.
- λΈλΌμ°μ κ°λ°μ λꡬ: λΈλΌμ°μ μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ CSP μλ°μ μλ³νκ³ μ μ± μ λλ²κ·Έν μ μμ΅λλ€.
- Mozilla Observatory: CSPλ₯Ό ν¬ν¨νμ¬ μΉμ¬μ΄νΈμ 보μ ꡬμ±μ λΆμνλ μΉ κΈ°λ° λꡬμ λλ€.
CSP λ° μ΅μ μΉ νλ μμν¬
μ΅μ μΉ νλ μμν¬λ μ’ μ’ CSPμ λν λ΄μ₯λ μ§μμ μ 곡νμ¬ μ μ± μ ꡬννκ³ κ΄λ¦¬νκΈ° μ½κ² λ§λλλ€. λ€μμ λͺ κ°μ§ μΈκΈ° μλ νλ μμν¬μμ CSPλ₯Ό μ¬μ©νλ λ°©λ²μ λν κ°λ΅ν κ°μμ λλ€.
- React: React μ ν리μΌμ΄μ μ μ μ ν HTTP ν€λ λλ λ©ν νκ·Έλ₯Ό μ€μ νμ¬ CSPλ₯Ό μ¬μ©ν μ μμ΅λλ€. styled-components λλ μ μ¬ν CSS-in-JS μ루μ μ μ¬μ©ν λ μΈλΌμΈ μ€νμΌμ λν nonceλ₯Ό μμ±νλ λ° λμμ΄ λλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
- Angular: Angularλ CSP λ©ν νκ·Έλ₯Ό μ€μ νλ λ° μ¬μ©ν μ μλ
Meta
μλΉμ€λ₯Ό μ 곡ν©λλ€. λΉλ νλ‘μΈμ€κ° μ μ ν nonce λλ ν΄μ μμ΄ μΈλΌμΈ μ€νμΌμ΄λ μ€ν¬λ¦½νΈλ₯Ό λμ νμ§ μλμ§ νμΈν©λλ€. - Vue.js: Vue.js μ ν리μΌμ΄μ μ μλ² μΈ‘ λ λλ§μ νμ©νμ¬ CSP ν€λλ₯Ό μ€μ ν μ μμ΅λλ€. λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ μ κ²½μ° λ©ν νκ·Έλ₯Ό μ¬μ©ν μ μμ§λ§ μ μ€νκ² κ΄λ¦¬ν΄μΌ ν©λλ€.
- Node.js (Express): Express.js λ―Έλ€μ¨μ΄λ₯Ό μ¬μ©νμ¬ CSP ν€λλ₯Ό λμ μΌλ‘ μ€μ ν μ μμ΅λλ€.
helmet
κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ μ μ± μ μ½κ² ꡬμ±ν μ μλλ‘ CSP λ―Έλ€μ¨μ΄λ₯Ό μ 곡ν©λλ€.
μ€μ CSP μ¬μ© μμ
μ μΈκ³μ λ§μ μ‘°μ§μμ μΉμ¬μ΄νΈμ μΉ μ ν리μΌμ΄μ μ 보νΈνκΈ° μν΄ CSPλ₯Ό μ±κ³΅μ μΌλ‘ ꡬννμ΅λλ€. λ€μμ λͺ κ°μ§ μμ λλ€.
- Google: Googleμ Gmail λ° Google κ²μμ ν¬ν¨ν λ€μν μΉ μμ±μ 보νΈνκΈ° μν΄ CSPλ₯Ό κ΄λ²μνκ² μ¬μ©ν©λλ€. CSP μ μ± λ° κ²½νμ 곡κ°μ μΌλ‘ 곡μ νμ΅λλ€.
- Facebook: Facebookμ XSS 곡격μΌλ‘λΆν° νλ«νΌμ 보νΈνκΈ° μν΄ CSPλ₯Ό μ¬μ©ν©λλ€. CSP ꡬνμ λν λΈλ‘κ·Έ κ²μλ¬Όκ³Ό νλ μ ν μ΄μ μ κ²μνμ΅λλ€.
- Twitter: Twitterλ μ μ± μ€ν¬λ¦½νΈ λ° κΈ°ν 보μ μνμΌλ‘λΆν° μ¬μ©μλ₯Ό 보νΈνκΈ° μν΄ CSPλ₯Ό ꡬννμ΅λλ€.
- μ λΆ κΈ°κ΄: μ μΈκ³μ λ§μ μ λΆ κΈ°κ΄μμ μΉμ¬μ΄νΈμ μΉ μ ν리μΌμ΄μ μ 보νΈνκΈ° μν΄ CSPλ₯Ό μ¬μ©ν©λλ€.
- κΈμ΅ κΈ°κ΄: κΈμ΅ κΈ°κ΄μ μ’ μ’ λ―Όκ°ν κ³ κ° λ°μ΄ν°λ₯Ό 보νΈνκΈ° μν΄ μ λ°μ μΈ λ³΄μ μ λ΅μ μΌνμΌλ‘ CSPλ₯Ό μ¬μ©ν©λλ€.
CSPμ λ―Έλ
CSPλ μ§ννλ νμ€μ΄λ©° μλ‘μ΄ κΈ°λ₯κ³Ό μ§μΉ¨μ΄ μ§μμ μΌλ‘ μΆκ°λκ³ μμ΅λλ€. CSPμ λ―Έλλ λ€μκ³Ό κ΄λ ¨λ κ°λ₯μ±μ΄ λμ΅λλ€.
- ν₯μλ λΈλΌμ°μ μ§μ: CSPκ° λ λ리 μ±νλ¨μ λ°λΌ λΈλΌμ°μ μ§μμ΄ κ³μ κ°μ λ κ²μ λλ€.
- λμ± λ°μ λ μ§μΉ¨: μλ‘μ΄ λ³΄μ μνμ ν΄κ²°νκΈ° μν΄ μλ‘μ΄ μ§μΉ¨μ΄ μΆκ°λ κ²μ λλ€.
- λ λμ λꡬ: CSP μ μ± μ ꡬννκ³ κ΄λ¦¬νλ λ° λμμ΄ λλ λμ± μ κ΅ν λκ΅¬κ° κ°λ°λ κ²μ λλ€.
- κΈ°ν 보μ νμ€κ³Όμ ν΅ν©: CSPλ Subresource Integrity(SRI) λ° HTTP Strict Transport Security(HSTS)μ κ°μ κΈ°ν 보μ νμ€κ³Ό μ μ λ ν΅ν©λ κ²μ λλ€.
κ²°λ‘
μΉ μ½ν μΈ λ³΄μ μ μ± (CSP)μ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) 곡격μ λ°©μ§νκ³ μΉ μ ν리μΌμ΄μ μμ μ€ν¬λ¦½νΈ μ€νμ μ μ΄νλ κ°λ ₯ν λꡬμ λλ€. CSP μ μ± μ μ μ€νκ² μ μν¨μΌλ‘μ¨ μΉμ¬μ΄νΈμ 곡격 νλ©΄μ ν¬κ² μ€μ΄κ³ μ λ°μ μΈ μΉ λ³΄μμ κ°νν μ μμ΅λλ€. CSPλ₯Ό ꡬννλ κ²μ μ΄λ €μΈ μ μμ§λ§ κ·Έ μ΄μ μ κ·Έ λ Έλ ₯μ μΆ©λΆν 보μν©λλ€. μ΄ κ°μ΄λμ μ€λͺ λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ λ€μν 보μ μνμΌλ‘λΆν° μΉμ¬μ΄νΈμ μ¬μ©μλ₯Ό ν¨κ³Όμ μΌλ‘ 보νΈν μ μμ΅λλ€.
μ νμ μΈ μ μ± μΌλ‘ μμνκ³ , μ² μ νκ² ν μ€νΈνκ³ , μ κΈ°μ μΌλ‘ λͺ¨λν°λ§νκ³ , μ΅μ CSP κ°λ° μ 보λ₯Ό μ΅μ μνλ‘ μ μ§νμμμ€. μ΄λ¬ν λ¨κ³λ₯Ό μννλ©΄ CSP μ μ± μ΄ ν¨κ³Όμ μ΄κ³ μΉμ¬μ΄νΈμ κ°λ₯ν μ΅κ³ μ 보νΈλ₯Ό μ 곡νλμ§ νμΈν μ μμ΅λλ€.
κΆκ·Ήμ μΌλ‘ CSPλ λ§λ³ν΅μΉμ½μ μλμ§λ§ ν¬κ΄μ μΈ μΉ λ³΄μ μ λ΅μ νμ κ΅¬μ± μμμ λλ€. CSPλ₯Ό μ λ ₯ μ ν¨μ± κ²μ¬, μΆλ ₯ μΈμ½λ© λ° μ κΈ°μ μΈ λ³΄μ κ°μ¬μ κ°μ κΈ°ν 보μ μ‘°μΉμ κ²°ν©νμ¬ κ΄λ²μν μΉ λ³΄μ μνμ λν κ°λ ₯ν λ°©μ΄λ₯Ό ꡬμΆν μ μμ΅λλ€.