컨í ì¸ ë³´ì ì ì± (CSP)
ì½í ì¸ ë³´ì ì ì± (CSP)ë êµì°¨ ì¬ì´í¸ ì¤í¬ë¦½í (XSS)ê³¼ ë°ì´í° 주ì 공격ì ë¹ë¡¯í í¹ì ì íì 공격ì íì§íê³ ìííë ë° ëìì´ ëë ì¶ê° ë³´ì ê³ì¸µì ëë¤. ì´ë¬í 공격ì ë°ì´í° ì ëìì ì¬ì´í¸ í¼ì, 맬ì¨ì´ ë°°í¬ì ì´ë¥´ê¸°ê¹ì§ 모ë ê²ì ì¬ì©ë©ëë¤.
CSPë ì´ì ë²ì ê³¼ ìë²½íê² í¸íëëë¡ ì¤ê³ëììµëë¤(ì´ì ë²ì ê³¼ì í¸íì±ìì ì¼ë¶ ëª ìì ì¼ë¡ ì¸ê¸ë ë¶ì¼ì¹ê° ìë CSP ë²ì 2ë ì ì¸, ìì¸í ë´ì©ì ì¬ê¸° ì¹ì 1.1 참조). ì´ë¥¼ ì§ìíì§ ìë ë¸ë¼ì°ì ë ì¬ì í ì´ë¥¼ 구ííë ìë²ìì ìëíë©° ê·¸ ë°ëì ê²½ì°ë ë§ì°¬ê°ì§ì ëë¤. CSP를 ì§ìíì§ ìë ë¸ë¼ì°ì ë CSP를 무ìíê³ íìì ê°ì´ ìëíë©° 기본ì ì¼ë¡ ì¹ ì½í ì¸ ì ëí íì¤ ëì¼ ì¶ì² ì ì± ì ì¬ì©í©ëë¤. ì¬ì´í¸ìì CSP í¤ë를 ì ê³µíì§ ìë ê²½ì° ë¸ë¼ì°ì ë ë§ì°¬ê°ì§ë¡ íì¤ ëì¼ ì¶ì² ì ì± ì ì¬ì©í©ëë¤.
CSP를 íì±ííë ¤ë©´ Content-Security-Policy HTTP í¤ë를 ë°ííëë¡ ì¹ ìë²ë¥¼ 구ì±í´ì¼ í©ëë¤. (ê°ëì© X-Content-Security-Policy í¤ë를 ë³¼ìë ìì§ë§, ì´ë ì´ì ë²ì ì´ë¯ë¡ ë ì´ì ì¤ì í íìê° ììµëë¤.)
ë¤ë¥¸ ë°©ë²ì¼ë¡ , <meta> ìì를 ì¬ì©íì¬ ì ì±
ì 구ì±í ì ììµëë¤. ì를 ë¤ë©´ ë¤ìê³¼ ê°ìµëë¤.
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src https://*; child-src 'none';" />
ì°¸ê³ : CSP ìë° ë³´ê³ ì ì ì¡ê³¼ ê°ì ì¼ë¶ 기ë¥ì HTTP í¤ë를 ì¬ì©í ëë§ ì¬ì©í ì ììµëë¤.
ìí
>êµì°¨ ì¬ì´í¸ ì¤í¬ë¦½í ìí
CSPì 주ì 목íë XSS 공격ì ìííê³ ë³´ê³ íë ê²ì ëë¤. XSS 공격ì ìë²ìì ë°ì ì½í ì¸ ë¥¼ ë¸ë¼ì°ì ê° ì 뢰íë¤ë ì ì ì ì©í©ëë¤. ë¸ë¼ì°ì ë ì½í ì¸ ì ì¶ì²ë¥¼ ì 뢰í기 ë문ì ì½í ì¸ ê° ì´ìí ê³³ìì ì¤ëë¼ë ì ì± ì¤í¬ë¦½í¸ë¥¼ í¼í´ìì ë¸ë¼ì°ì ìì ì¤íí©ëë¤.
CSP를 ì¬ì©íë©´ ìë² ê´ë¦¬ìê° ë¸ë¼ì°ì ìì ì¤í ê°ë¥í ì¤í¬ë¦½í¸ì ì í¨í ìì¤ë¡ ê°ì£¼í´ì¼ íë ëë©ì¸ì ì§ì íì¬ XSSê° ë°ìí ì ìë 벡í°ë¥¼ ì¤ì´ê±°ë ì ê±°í ì ììµëë¤. ê·¸ë¬ë©´ CSP í¸í ë¸ë¼ì°ì ë íì©ë ëë©ì¸ìì ë°ì ìì¤ íì¼ìì ë¡ëë ì¤í¬ë¦½í¸ë§ ì¤ííê³ HTML ìì±ì í¬í¨í ì¸ë¼ì¸ ì¤í¬ë¦½í¸ ë° ì´ë²¤í¸ ì²ë¦¬ ë±ì ë¤ë¥¸ 모ë ì¤í¬ë¦½í¸ë 무ìí©ëë¤.
ê¶ê·¹ì ì¸ ë³´í¸ ííë¡ì ì¤í¬ë¦½í¸ ì¤íì íì©íì§ ìì¼ë ¤ë ì¬ì´í¸ë ì ìì ì¼ë¡ ì¤í¬ë¦½í¸ ì¤íì íì©íì§ ìëë¡ ì íí ì ììµëë¤.
í¨í· ì¤ëí 공격 ìí
ì½í
ì¸ ë¥¼ ë¡ëí ì ìë ëë©ì¸ì ì ííë ê² ì¸ìë ìë²ë ì¬ì©í ì ìë íë¡í ì½ì ì§ì í ì ììµëë¤. ì를 ë¤ì´(ì´ìì ì¼ë¡ë ë³´ì ê´ì ìì) ìë²ë 모ë ì½í
ì¸ ê° HTTPS를 ì¬ì©íì¬ ë¡ëëëë¡ ì§ì í ì ììµëë¤. ìì í ë°ì´í° ì ì¡ ë³´ì ì ëµììë ë°ì´í° ì ì¡ì ìí´ HTTPS를 ì ì©í ë¿ë§ ìëë¼ ëª¨ë ì¿ í¤ì secure ìì±ì íìíê³ HTTP íì´ì§ë í´ë¹ HTTPS íì´ì§ë¡ ìë 리ëë ì
ì ì ê³µí©ëë¤. ì¬ì´í¸ë Strict-Transport-Security HTTP í¤ë를 ì¬ì©íì¬ ë¸ë¼ì°ì ê° ìí¸íë ì±ëì íµí´ìë§ ì¬ì´í¸ì ì°ê²°íëë¡ í ìë ììµëë¤.
CSP ì¬ì©í기
컨í
ì¸ ë³´ì ì ì±
구ì±ì Content-Security-Policy HTTP í¤ë를 ì¹ íì´ì§ì ì¶ê°íê³ ì¬ì©ì ìì´ì í¸ê° í´ë¹ íì´ì§ì ëí´ ë¡ëí ì ìë 리ìì¤ë¥¼ ì ì´íë ê°ì ì§ì íë ìì
ì´ ìë°ë©ëë¤.
ì를 ë¤ì´ ì´ë¯¸ì§ë¥¼ ì
ë¡ëíê³ íìíë íì´ì§ë ì´ëììë ì´ë¯¸ì§ë¥¼ íì©í ì ìì§ë§ í¼ ìì
ì í¹ì ìëí¬ì¸í¸ë¡ ì íí ì ììµëë¤. ì ì íê² ì¤ê³ë ì½í
ì¸ ë³´ì ì ì±
ì êµì°¨ ì¬ì´í¸ ì¤í¬ë¦½í
공격ì¼ë¡ë¶í° íì´ì§ë¥¼ ë³´í¸íë ë° ëìì´ ë©ëë¤. ì´ ë¬¸ìììë ì´ë¬í í¤ë를 ì¬ë°ë¥´ê² 구ì±íë ë°©ë²ì ì¤ëª
íê³ ìì 를 ì´í´ë´
ëë¤.
ì ì± ì§ì í기
ë¤ìê³¼ ê°ì´ Content-Security-Policy HTTP í¤ë를 ì¬ì©íì¬ ì ì±
ì ì§ì í ì ììµëë¤.
Content-Security-Policy: policy
ì´ ì ì± ì ì¬ë¬ë¶ì ì½í ì¸ ë³´ì ì ì± ì ì¤ëª íë ì ì± ì§ì문ì í¬í¨í 문ìì´ì ëë¤.
ì ì± ìì±í기
ì ì±
ì ì¼ë ¨ì ì ì±
ì§ì문ì ì¬ì©íì¬ ì¤ì í©ëë¤. ê°ê°ì ì§ì문ì í¹ì 리ìì¤ ì í ëë ì ì±
ììì ëí ì ì±
ì ëíë
ëë¤. ìì²´ ì ì±
ì´ ìì ëë ë¤ë¥¸ 리ìì¤ ì íì ëí í´ë°±ì¸ default-src ì§ì문ì í¬í¨í´ì¼ í©ëë¤(ì ì²´ 목ë¡ì default-src ì§ì문 ì¤ëª
참조). ì¸ë¼ì¸ ì¤í¬ë¦½í¸ ì¤íì ë°©ì§íê³ eval() ì¬ì©ì ì°¨ë¨íë ¤ë©´ ì ì±
ì default-src ëë script-src ì§ì문ì í¬í¨í´ì¼ í©ëë¤.
ì¸ë¼ì¸ ì¤íì¼ì´ <style> ìì ëë style ìì±ìì ì ì©ëë ê²ì ì ííë ¤ë©´ ì ì±
ì default-src ëë style-src ì§ìë¬¸ì´ í¬í¨ëì´ì¼ í©ëë¤.
ë¤ìí ì íì í목ì ëí í¹ì ì§ìë¬¸ì´ ìì¼ë¯ë¡ ê° ì íì ê¸ê¼´, íë ì, ì´ë¯¸ì§, ì¤ëì¤ ë° ë¹ëì¤ ë¯¸ëì´, ì¤í¬ë¦½í¸ ë° ìì
ì를 í¬í¨íì¬ ìì²´ ì ì±
ì ê°ì§ ì ììµëë¤.
ì ì± ì§ì문ì ì ì²´ 목ë¡ì Content-Security-Policy í¤ë íì´ì§ë¥¼ 참조íì¸ì.
ìì : ì¼ë°ì ì¸ ì¬ì© ì¬ë¡
ì´ ì¹ì ììë ëª ê°ì§ ì¼ë°ì ì¸ ë³´ì ì ì± ìë리ì¤ì ì를 ì´í´ë´ ëë¤.
ìì 1
ì¹ ì¬ì´í¸ ê´ë¦¬ìë 모ë ì½í ì¸ ê° ì¬ì´í¸ ìì²´ì ì¶ì²(íì ëë©ì¸ ì ì¸)ìì ì¤ê¸°ë¥¼ ìí©ëë¤.
Content-Security-Policy: default-src 'self'
ìì 2
ì¹ ì¬ì´í¸ ê´ë¦¬ìë ì 뢰í ì ìë ëë©ì¸ ë° ëª¨ë íì ëë©ì¸ì ì½í ì¸ ë¥¼ íì©íë ¤ê³ í©ëë¤(CSPê° ì¤ì ë ëë©ì¸ê³¼ ëì¼í íìë ìì).
Content-Security-Policy: default-src 'self' example.com *.example.com
ìì 3
ì¹ ì¬ì´í¸ ê´ë¦¬ìë ì¹ ì í리ì¼ì´ì ì¬ì©ìê° ìì ì ì½í ì¸ ì 모ë ì본ì ì´ë¯¸ì§ë¥¼ í¬í¨í ì ìëë¡ íì©íì§ë§ ì¤ëì¤ ëë ë¹ëì¤ ë¯¸ëì´ë ì 뢰í ì ìë ê³µê¸ìë¡ ì ííê³ ëª¨ë ì¤í¬ë¦½í¸ë ì 뢰í ì ìë ì½ë를 í¸ì¤í íë í¹ì ìë²ë¡ë§ ì ííë ¤ê³ í©ëë¤.
Content-Security-Policy: default-src 'self'; img-src *; media-src example.org example.net; script-src userscripts.example.com
기본ì ì¼ë¡ ì¬ê¸°ìë 문ì ì본ì ì½í ì¸ ë§ íì©ëë©° ë¤ìì ìì¸ë¡ ì²ë¦¬ë©ëë¤.
- ì´ë¯¸ì§ë ì¶ì²ì ìê´ìì´ ë¡ëí ì ììµëë¤("*" ìì¼ëì¹´ë ì°¸ê³ ).
- 미ëì´ë example.org ë° example.netììë§ íì©ëë©° í´ë¹ ì¬ì´í¸ì íì ëë©ì¸ììë íì©ëì§ ììµëë¤.
- ì¤í ê°ë¥í ì¤í¬ë¦½í¸ë userscripts.example.comìì ì¨ ê²ë§ íì©ë©ëë¤.
ìì 4
ì¨ë¼ì¸ ë± í¹ ì¬ì´í¸ì ì¹ ì¬ì´í¸ ê´ë¦¬ìë 공격ìê° ìì²ì ëì²íë ê²ì ë°©ì§í기 ìí´ ëª¨ë ì½í ì¸ ê° TLS를 ì¬ì©íì¬ ë¡ëëìëì§ íì¸íë ¤ê³ í©ëë¤.
Content-Security-Policy: default-src https://onlinebanking.example.com
ìë²ë ë¨ì¼ ì¶ì²ì¸ onlinebanking.example.comìì í¹ë³í HTTPS를 íµí´ ë¡ëëë 문ìì ëí ì¡ì¸ì¤ë§ íì©í©ëë¤.
ìì 5
ì¹ ë©ì¼ ì¬ì´í¸ì ì¹ ì¬ì´í¸ ê´ë¦¬ìë ì ì ë©ì¼ì HTMLì íì©íê³ ì´ëììë ë¡ëë ì´ë¯¸ì§ë¥¼ íì©íë ¤ê³ íì§ë§ JavaScript ëë 기í ì ì¬ì ì¼ë¡ ìíí ì½í ì¸ ë íì©íì§ ìì¼ë ¤ê³ í©ëë¤.
Content-Security-Policy: default-src 'self' *.example.com; img-src *
ì´ ìì ìì script-src를 ì§ì íì§ ìê³ , default-src ì§ì문ì ì¬ì©í©ëë¤. ì¦, ì본 ìë²ììë§ ì¤í¬ë¦½í¸ë¥¼ ë¡ëí ì ììµëë¤.
ì ì± í ì¤í¸í기
ë°°í¬ë¥¼ ì½ê² í기 ìí´ CSPë ë³´ê³ ì ì© ëª¨ëë¡ ë°°í¬ë ì ììµëë¤. ì ì± ì´ ìíëì§ë ìì§ë§ 모ë ìë° ì¬íì ì ê³µë URIë¡ ë³´ê³ ë©ëë¤. ì¶ê°ì ì¼ë¡, ë³´ê³ ì ì ì© í¤ë를 ì¬ì©íì¬ ì ì± ì ì¤ì ë¡ ë°°í¬íì§ ìê³ ì ì± ì ëí í¥í ê°ì ì í ì¤í¸í ìë ììµëë¤.
Content-Security-Policy-Report-Only HTTP í¤ë를 ì¬ì©íì¬ ë¤ìê³¼ ê°ì´ ì ì±
ì ì§ì í ì ììµëë¤.
Content-Security-Policy-Report-Only: policy
Content-Security-Policy-Report-Only í¤ëì Content-Security-Policy í¤ëê° ëª¨ë ëì¼í ìëµì ìì¼ë©´, ë ì ì±
ì 모ë ì ì©ë©ëë¤.
Content-Security-Policy-Report-Only ì ì±
ì ë³´ê³ ì를 ìì±íì§ë§ ìíëì§ ìë ë°ë©´, Content-Security-Policy í¤ëì ì§ì ë ì ì±
ì ìíë©ëë¤.
ë³´ê³ íì±í
기본ì ì¼ë¡ ìë° ë³´ê³ ìë ì ì¡ëì§ ììµëë¤. ìë° ë³´ê³ ë¥¼ íì±ííë ¤ë©´ ìëì ê°ì´ ë³´ê³ ì를 ì ë¬ë°ì íë ì´ìì URI를 report-to ì ì±
ì§ì문ì ì§ì í´ì¼ í©ëë¤.
Content-Security-Policy: default-src 'self'; report-to http://reportcollector.example.com/collector.cgi
ê·¸ë° ë¤ì ë³´ê³ ì를 ìì íëë¡ ìë²ë¥¼ ì¤ì í´ì¼ íëë°, ì¬ì©ìê° ì ì íë¤ê³ íë¨íë ë°©ìì¼ë¡ ë°ì´í°ë¥¼ ì ì¥íê±°ë ì²ë¦¬íë©´ ë©ëë¤.
ìë° ë³´ê³ ì 구문
ë³´ê³ ì JSON ê°ì²´ë application/csp-report Content-Typeê³¼ í¨ê» ì ì¡ëë©° ë¤ì ë°ì´í°ë¥¼ í¬í¨í©ëë¤.
blocked-uri-
ì½í ì¸ ë³´ì ì ì± ì ìí´ ë¡ëê° ì°¨ë¨ë 리ìì¤ì URIì ëë¤. ì°¨ë¨ë URIê°
document-uriì ë¤ë¥¸ ì¶ì²ì¸ ê²½ì°, ì°¨ë¨ë URIë ì¤í¤ë§, í¸ì¤í¸ ê·¸ë¦¬ê³ í¬í¸ë§ í¬í¨ëëë¡ ìë¦ ëë¤. disposition-
Content-Security-Policy-Report-Onlyí¤ë ëëContent-Security-Policyí¤ë ì¬ì© ì¬ë¶ì ë°ë¼"enforce"ëë"report"ë¡ ëíë©ëë¤. document-uri-
ìë°ì´ ë°ìí 문ìì URIì ëë¤.
effective-directive-
ì ì± ìíì¼ë¡ ì¸í´ ìë°ì´ ë°ìí ì§ì문ì ëë¤. ì¤ì ë¡ ì ì©ë ì§ì문ì´
style-srcì¸ ê²½ì°ì Chromeì´style-src-elem/style-src-attrì ì ê³µíë ê²ê³¼ ê°ì´ ì¼ë¶ ë¸ë¼ì°ì ë ë¤ë¥¸ ê°ì ì ê³µí ì ììµëë¤. original-policy-
Content-Security-PolicyHTTP í¤ëì ì§ì ë ìë ì ì± ì ëë¤. referrer-
ìë°ì´ ë°ìí 문ìì 리í¼ë¬ì ëë¤.
script-sample-
ìë°ì ì¼ì¼í¨ ì¸ë¼ì¸ ì¤í¬ë¦½í¸, ì´ë²¤í¸ ì²ë¦¬ê¸° ëë ì¤íì¼ì ì²ì 40ìì ëë¤.
'report-sample'ì´ í¬í¨ëscript-src*ìstyle-src*ìë°ìë§ ì ì© ê°ë¥í©ëë¤. status-code-
ì ì ê°ì²´ê° ì¸ì¤í´ì¤íë 리ìì¤ì HTTP ìí ì½ëì ëë¤.
violated-directive-
ìë°ì´ ë°ìí ì§ì문ì ëë¤.
violated-directiveëeffective-directiveíëì ìì¬ì ì´ë¦ì´ë©° ëì¼í ê°ì ê°ì§ëë¤.
ìë° ë³´ê³ ì ìí
http://example.com/signup.htmlì ìë íì´ì§ë¥¼ ìê°í´ ë´
ìë¤. ë¤ì ì ì±
ì ì¬ì©íì¬ cdn.example.comì ì¤íì¼ìí¸ë¥¼ ì ì¸í 모ë í목ì íì©íì§ ìëë¡ ì¤ì í©ëë¤.
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-to /_/csp-reports
signup.htmlì HTMLì ë¤ìê³¼ ê°ìµëë¤.
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<title>Sign Up</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
ì¬ê¸°ì 컨í
ì¸ .
</body>
</html>
ì¤ì를 ë°ê²¬ íëì? ì¤íì¼ìí¸ë cdn.example.comììë§ ë¡ëí ì ìì§ë§ ì¹ì¬ì´í¸ë ìì²´ ì본(http://example.com)ìì ì¤íì¼ìí¸ë¥¼ ë¡ëíë ¤ê³ í©ëë¤.
CSP를 ì ì©í ì ìë ë¸ë¼ì°ì ë 문ì를 방문í ë ë¤ì ìë° ë³´ê³ ì를 http://example.com/_/csp-reportsì POST ìì²ì¼ë¡ ë³´ë
ëë¤.
{
"csp-report": {
"blocked-uri": "http://example.com/css/style.css",
"disposition": "report",
"document-uri": "http://example.com/signup.html",
"effective-directive": "style-src-elem",
"original-policy": "default-src 'none'; style-src cdn.example.com; report-to /_/csp-reports",
"referrer": "",
"status-code": 200,
"violated-directive": "style-src-elem"
}
}
ë³´ìë¤ìí¼ ë³´ê³ ììë blocked-uriì ìë° ë¦¬ìì¤ì ëí ì ì²´ ê²½ë¡ê° í¬í¨ë©ëë¤. íì§ë§ íì ê·¸ë° ê²ì ìëëë¤. ì를 ë¤ì´, signup.htmlì´ http://anothercdn.example.com/stylesheet.cssìì CSS를 ë¡ëíë ¤ê³ íë©´ ë¸ë¼ì°ì ë ì ì²´ ê²½ë¡ë¥¼ í¬í¨íì§ ìê³ ì본(http://anothercdn.example.com)ë§ í¬í¨ìíµëë¤.
CSP ëª
ì¸ììì ì´ ì´ìí ëìì ëí ì¤ëª
ì ë¤ì ì ììµëë¤. ìì½íìë©´ ì´ë êµì°¨ ì¶ì² 리ìì¤ì ëí 민ê°í ì ë³´ì ì ì¶ì ë°©ì§í기 ìí¨ì
ëë¤.
ë¸ë¼ì°ì í¸íì±
>í¸íì± ì°¸ê³ ì¬í
Safari ì¹ ë¸ë¼ì°ì ì ì¼ë¶ ë²ì ìë í¹ì ë¹í¸íì±ì´ ìì¼ë©°, ì´ë¡ ì¸í´ Content Security Policy í¤ëê° ì¤ì ëì´ ìì§ë§ Same Origin í¤ëê° ìë ê²½ì° ë¸ë¼ì°ì ê° ìì²´ í¸ì¤í ë ì½í ì¸ ì ì¤íì¬ì´í¸ ì½í ì¸ ë¥¼ ì°¨ë¨íê³ ì½í ì¸ ë³´ì ì ì± ì´ ì½í ì¸ ë¥¼ íì©íì§ ì기 ë문ì ì½í ì¸ ë¥¼ ì못 ë³´ê³ í©ëë¤.
ê°ì´ 보기
Content-Security-PolicyHTTP í¤ëContent-Security-Policy-Report-OnlyHTTP í¤ë- WebExtensionsì ì½í ì¸ ë³´ì
- ì¹ ì커ì CSP
- ê°ì¸ ì ë³´ ë³´í¸, ê¶í ë° ì ë³´ ë³´ì
- CSP íê°ì - ì¬ë¬ë¶ì ì½í ì¸ ë³´ì ì ì± ì íê°í ì ììµëë¤.