์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP) ์ฌ์ธต ๊ฐ์ด๋๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๋ณด์์ ๋ง์คํฐํ์ธ์. CSP ํค๋ ๊ตฌํ, XSS ๋ฐ ๋ฐ์ดํฐ ์ฃผ์ ์ํ, ๊ธ๋ก๋ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณดํธ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐํ: ์๋ฐ์คํฌ๋ฆฝํธ ๋ณด์ ํค๋ ๋ฐ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP) ๊ตฌํ์ ์ํ ์ข ํฉ ๊ฐ์ด๋
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ํ๊ฒฝ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ก์ ์ฐ๋ฆฌ๋ ๊ธฐ๋ฅ์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๊ฒฝํ์ ๊ตฌ์ถํ ๋ฟ๋ง ์๋๋ผ, ๋์์์ด ์งํํ๋ ์๋ง์ ์ํ์ผ๋ก๋ถํฐ ์ด๋ฅผ ๋ณดํธํด์ผ ํ ์ฑ ์์ด ์์ต๋๋ค. ํ๋ก ํธ์๋ ๋ณด์์ ๊ฐํํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋๊ตฌ ์ค ํ๋๋ ์ ์ ํ HTTP ๋ณด์ ํค๋๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค. ๊ทธ์ค์์๋ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ๋์ ์ฝํ ์ธ ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ ์ฒ๋ฆฌํ ๋ ํนํ ์ค์ํ ๋ฐฉ์ด ๋ฉ์ปค๋์ฆ์ผ๋ก ๋๋ณด์ ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ ์ ์ค์ ์ ๋๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณด์ ํค๋์ ๋ณต์กํ ๋ด์ฉ์ ์์ธํ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค. CSP๊ฐ ๋ฌด์์ธ์ง, ์ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ธ์ง ํ๊ตฌํ๊ณ , ๊ตฌํ์ ์ํ ์คํ ๊ฐ๋ฅํ ๋จ๊ณ๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์์ ๋ณด์ ์ ๋ฌธ๊ฐ๋ค์ด ๋ ํ๋ ฅ์ ์ด๊ณ ์์ ํ ์น ๊ฒฝํ์ ๊ตฌ์ถํ ์ ์๋ ์ง์์ ๊ฐ์ถ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
ํ๊ฒฝ ์ดํดํ๊ธฐ: ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณด์์ด ์ค์ํ๊ฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ํธ์์ฉ์ ์ด๊ณ ๋์ ์ธ ์น ํ์ด์ง๋ฅผ ๋ง๋๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ์ง๋ง, ๋ ํนํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๊ธฐ๋ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)์ ์กฐ์ํ๊ณ , ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด๊ณ , ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฅ๋ ฅ์ ์ ์์ ์ธ ํ์์์ ์ํด ์ ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ด๋ จ๋ ์ผ๋ฐ์ ์ธ ์ทจ์ฝ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS): ๊ณต๊ฒฉ์๊ฐ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ณด๋ ์น ํ์ด์ง์ ์ ์ฑ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฃผ์ ํฉ๋๋ค. ์ด๋ ์ธ์ ํ์ด์ฌํน, ๋ฐ์ดํฐ ๋๋ ๋๋ ์ ์ฑ ์ฌ์ดํธ๋ก์ ๋ฆฌ๋๋ ์ ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ฃผ์ : ์์ ํ์ง ์์ ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์์์ ์ฝ๋๋ ๋ช ๋ น์ ์ฃผ์ ํ๊ณ ์คํํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ ์ฑ ์ 3์ ์คํฌ๋ฆฝํธ: ์์๋์๊ฑฐ๋ ์๋์ ์ผ๋ก ์ ์์ ์ธ ์ ๋ขฐํ ์ ์๋ ์์ค์ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ.
- DOM ๊ธฐ๋ฐ XSS: ์์ ํ์ง ์์ ๋ฐฉ์์ผ๋ก DOM์ ์กฐ์ํ๋ ํด๋ผ์ด์ธํธ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ด์ ์ทจ์ฝ์ .
์์ ํ ์ฝ๋ฉ ๊ดํ์ด ์ฒซ ๋ฒ์งธ ๋ฐฉ์ด์ ์ด์ง๋ง, HTTP ๋ณด์ ํค๋๋ ๋ธ๋ผ์ฐ์ ์์ค์์ ๋ณด์ ์ ์ฑ ์ ๊ฐ์ ํ๋ ์ ์ธ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ถ๊ฐ์ ์ธ ๋ณดํธ ๊ณ์ธต์ ์ ๊ณตํฉ๋๋ค.
๋ณด์ ํค๋์ ํ: ๋ฐฉ์ด์ ๊ธฐ์ด
HTTP ๋ณด์ ํค๋๋ ์น ์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ณด๋ด๋ ์ง์๋ฌธ์ผ๋ก, ์น์ฌ์ดํธ ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ด๋ป๊ฒ ๋์ํด์ผ ํ๋์ง๋ฅผ ์ง์ํฉ๋๋ค. ์ด๋ ๋ค์ํ ๋ณด์ ์ํ์ ์ํํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ ํ๋ ์น ๋ณด์์ ์ด์์ ๋๋ค. ์ฃผ์ ๋ณด์ ํค๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Strict-Transport-Security (HSTS): HTTPS ์ฌ์ฉ์ ๊ฐ์ ํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
- X-Frame-Options: ํ์ด์ง๊ฐ
<iframe>,<frame>๋๋<object>์์ ๋ ๋๋ง๋ ์ ์๋์ง ์ ์ดํ์ฌ ํด๋ฆญ์ฌํน ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค. - X-Content-Type-Options: ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝํ ์ธ ์ ํ์ MIME ์ค๋ํํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ํน์ ์ ํ์ ๊ณต๊ฒฉ์ ์ํํฉ๋๋ค.
- X-XSS-Protection: ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ XSS ํํฐ๋ฅผ ํ์ฑํํฉ๋๋ค(ํ์ง๋ง ์ด๋ ๋๋ถ๋ถ CSP์ ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ผ๋ก ๋์ฒด๋์์ต๋๋ค).
- Referrer-Policy: ์์ฒญ๊ณผ ํจ๊ป ์ ์ก๋๋ ๋ฆฌํผ๋ฌ ์ ๋ณด์ ์์ ์ ์ดํฉ๋๋ค.
- Content-Security-Policy (CSP): ์ด ๋ ผ์์ ์ด์ ์ผ๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ ํน์ ํ์ด์ง์ ๋ํด ๋ก๋ํ ์ ์๋ ๋ฆฌ์์ค๋ฅผ ์ ์ดํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
์ด ๋ชจ๋ ํค๋๊ฐ ์ค์ํ์ง๋ง, CSP๋ ์คํฌ๋ฆฝํธ ๋ฐ ๊ธฐํ ๋ฆฌ์์ค์ ์คํ์ ๋ํด ๋ ๋ณด์ ์ธ ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๊ด๋ จ ์ทจ์ฝ์ ์ ์ํํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค.
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP) ์ฌ์ธต ๋ถ์
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ๋ฐ ๋ฐ์ดํฐ ์ฃผ์ ๊ณต๊ฒฉ๊ณผ ๊ฐ์ ํน์ ์ ํ์ ๊ณต๊ฒฉ์ ํ์งํ๊ณ ์ํํ๋ ๋ฐ ๋์์ด ๋๋ ์ถ๊ฐ ๋ณด์ ๊ณ์ธต์ ๋๋ค. CSP๋ ์น์ฌ์ดํธ ๊ด๋ฆฌ์๊ฐ ์น ํ์ด์ง์์ ๋ก๋ํ๊ณ ์คํํ ์ ์๋ ๋ฆฌ์์ค(์คํฌ๋ฆฝํธ, ์คํ์ผ์ํธ, ์ด๋ฏธ์ง, ๊ธ๊ผด ๋ฑ)๋ฅผ ์ง์ ํ ์ ์๋ ์ ์ธ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฑ ์ด ์ ์๋์ง ์์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ์ถ์ฒ์ ๋ฆฌ์์ค ๋ก๋๋ฅผ ํ์ฉํฉ๋๋ค.
CSP๋ ๊ฐ ๋ฆฌ์์ค ์ ํ์ ๋ํด ์ ๋ขฐํ ์ ์๋ ์์ค์ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์ ์ํ ์ ์๋๋ก ํ์ฌ ์๋ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ CSP ํค๋๋ฅผ ์์ ํ๋ฉด ์ด๋ฌํ ๊ท์น์ ๊ฐ์ ํฉ๋๋ค. ์ ๋ขฐํ ์ ์๋ ์์ค์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์ฐจ๋จํ์ฌ ์ ์ฌ์ ์ธ ์ ์ฑ ์ฝํ ์ธ ๊ฐ ๋ก๋๋๊ฑฐ๋ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
CSP ์๋ ๋ฐฉ์: ํต์ฌ ๊ฐ๋
CSP๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก Content-Security-Policy HTTP ํค๋๋ฅผ ์ ์กํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ์ด ํค๋์๋ ๊ฐ๊ฐ ๋ฆฌ์์ค ๋ก๋ฉ์ ํน์ ์ธก๋ฉด์ ์ ์ดํ๋ ์ผ๋ จ์ ์ง์๋ฌธ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ๋ณด์์ ๊ฐ์ฅ ์ค์ํ ์ง์๋ฌธ์ script-src์
๋๋ค.
์ผ๋ฐ์ ์ธ CSP ํค๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com; object-src 'none'; img-src *; media-src media1.com media2.com; style-src 'self' 'unsafe-inline'
๋ช ๊ฐ์ง ์ฃผ์ ์ง์๋ฌธ์ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
์๋ฐ์คํฌ๋ฆฝํธ ๋ณด์์ ์ํ ์ฃผ์ CSP ์ง์๋ฌธ
default-src: ์ด๊ฒ์ ํด๋ฐฑ(fallback) ์ง์๋ฌธ์ ๋๋ค. ํน์ ์ง์๋ฌธ(์:script-src)์ด ์ ์๋์ง ์์ ๊ฒฝ์ฐ,default-src๊ฐ ํด๋น ๋ฆฌ์์ค ์ ํ์ ํ์ฉ๋๋ ์์ค๋ฅผ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.script-src: ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ ์ ์ดํ๋ ๊ฐ์ฅ ์ค์ํ ์ง์๋ฌธ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.object-src: Flash์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ๋ํ ์ ํจํ ์์ค๋ฅผ ์ ์ํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์์ ํ ๋นํ์ฑํํ๋ ค๋ฉด ์ด ๊ฐ์'none'์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋ฉ๋๋ค.base-uri: ๋ฌธ์์<base>์์์์ ์ฌ์ฉํ ์ ์๋ URL์ ์ ํํฉ๋๋ค.form-action: ๋ฌธ์์์ ์ ์ถ๋ HTML ์์์ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋ URL์ ์ ํํฉ๋๋ค.frame-ancestors: ํ์ฌ ํ์ด์ง๋ฅผ ํ๋ ์์ ํฌํจํ ์ ์๋ ์ถ์ฒ๋ฅผ ์ ์ดํฉ๋๋ค. ์ด๋X-Frame-Options์ ํ๋์ ์ธ ๋์ฒด์ฌ์ ๋๋ค.upgrade-insecure-requests: ๋ธ๋ผ์ฐ์ ์๊ฒ ์ฌ์ดํธ์ ๋ชจ๋ ์์ ํ์ง ์์ URL(HTTP)์ ๋ณด์ URL(HTTPS)๋ก ์ ๊ทธ๋ ์ด๋๋ ๊ฒ์ฒ๋ผ ์ฒ๋ฆฌํ๋๋ก ์ง์ํฉ๋๋ค.
CSP์ ์์ค ๊ฐ ์ดํดํ๊ธฐ
CSP ์ง์๋ฌธ์ ์ฌ์ฉ๋๋ ์์ค ๊ฐ์ ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ๋ก ๊ฐ์ฃผ๋๋ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์์ค ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
'self': ๋ฌธ์์ ๋์ผํ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ํ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์คํด, ํธ์คํธ ๋ฐ ํฌํธ๊ฐ ํฌํจ๋ฉ๋๋ค.'unsafe-inline':<script>๋ธ๋ก ๋ฐ ์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ(์:onclick์์ฑ)์ ๊ฐ์ ์ธ๋ผ์ธ ๋ฆฌ์์ค๋ฅผ ํ์ฉํฉ๋๋ค. ๊ทน๋์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ ์ฌ์ฉํ์ธ์! ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ๋ฉด XSS์ ๋ํ CSP์ ํจ๊ณผ๊ฐ ํฌ๊ฒ ์ฝํ๋ฉ๋๋ค.'unsafe-eval':eval()๋ฐsetTimeout()๊ณผ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฐ ํจ์๋ฅผ ๋ฌธ์์ด ์ธ์์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด ํผํด์ผ ํฉ๋๋ค.*: ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ ์์ผ๋์นด๋์ ๋๋ค(๋งค์ฐ ๋๋ฌผ๊ฒ ์ฌ์ฉ).- ์คํด: ์:
https:(HTTPS์ ๋ชจ๋ ํธ์คํธ ํ์ฉ). - ํธ์คํธ: ์:
example.com(ํด๋น ํธ์คํธ์ ๋ชจ๋ ์คํด ๋ฐ ํฌํธ ํ์ฉ). - ์คํด ๋ฐ ํธ์คํธ: ์:
https://example.com. - ์คํด, ํธ์คํธ ๋ฐ ํฌํธ: ์:
https://example.com:8443.
์ฝํ ์ธ ๋ณด์ ์ ์ฑ ๊ตฌํ: ๋จ๊ณ๋ณ ์ ๊ทผ ๋ฐฉ์
CSP๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ์ ์คํ ๊ณํ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค ์์กด์ฑ์ ๋ํ ์ฒ ์ ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค. ์๋ชป ๊ตฌ์ฑ๋ CSP๋ ์ฌ์ดํธ๋ฅผ ์์์ํฌ ์ ์์ง๋ง, ์ ๊ตฌ์ฑ๋ CSP๋ ๋ณด์์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
1๋จ๊ณ: ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์์ค ๊ฐ์ฌ
CSP๋ฅผ ์ ์ํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋์ง ์์์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ๋ด๋ถ ์คํฌ๋ฆฝํธ: ์์ฒด ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ.
- ์ 3์ ์คํฌ๋ฆฝํธ: ๋ถ์ ์๋น์ค(์: Google Analytics), ๊ด๊ณ ๋คํธ์ํฌ, ์์ ๋ฏธ๋์ด ์์ ฏ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ CDN(์: jQuery, Bootstrap).
- ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ: HTML ํ๊ทธ๋
<script>๋ธ๋ก์ ์ง์ ํฌํจ๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋. - ์คํ์ผ์ํธ: ๋ด๋ถ ๋ฐ ์ธ๋ถ ๋ชจ๋.
- ์ด๋ฏธ์ง, ๋ฏธ๋์ด, ๊ธ๊ผด: ์ด๋ฌํ ๋ฆฌ์์ค๊ฐ ํธ์คํ ๋๋ ์์น.
- ์์: ์์ ์ ์ถ ๋์.
- ์น ์์ปค ๋ฐ ์๋น์ค ์์ปค: ํด๋นํ๋ ๊ฒฝ์ฐ.
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ์ฝ์ ๋ฐ ์ ๋ฌธ ๋ณด์ ์ค์บ๋์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
2๋จ๊ณ: CSP ์ ์ฑ ์ ์ (๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋๋ก ์์)
CSP๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ ๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์์ ์์ํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์๋ฐ ์ฌํญ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. Content-Security-Policy-Report-Only ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๋ชจ๋ ์๋ฐ ์ฌํญ์ ์ง์ ๋ ๋ณด๊ณ ์๋ํฌ์ธํธ๋ก ์ ์ก๋ฉ๋๋ค.
๋ณด๊ณ ์ ์ ์ฉ ํค๋์ ์:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; connect-src 'self' api.example.com;
๋ณด๊ณ ๋ฅผ ํ์ฑํํ๋ ค๋ฉด report-uri ๋๋ report-to ์ง์๋ฌธ๋ ์ง์ ํด์ผ ํฉ๋๋ค:
report-uri: (์ฌ์ฉ ์ค๋จ๋์์ง๋ง ์ฌ์ ํ ๋๋ฆฌ ์ง์๋จ) ์๋ฐ ๋ณด๊ณ ์๋ฅผ ์ ์กํ URL์ ์ง์ ํฉ๋๋ค.report-to: (๋ ์๋กญ๊ณ ์ ์ฐํจ) ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ์์ธํ ๊ธฐ์ ํ๋ JSON ๊ฐ์ฒด๋ฅผ ์ง์ ํฉ๋๋ค.
report-uri๋ฅผ ์ฌ์ฉํ ์:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; report-uri /csp-violation-report-endpoint;
์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ์์ ํ๊ณ ๊ธฐ๋กํ๊ธฐ ์ํด ๋ฐฑ์๋ ์๋ํฌ์ธํธ(์: Node.js, Python, PHP)๋ฅผ ์ค์ ํ์ญ์์ค. ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ์ฌ ์ด๋ค ๋ฆฌ์์ค๊ฐ ์ ์ฐจ๋จ๋๋์ง ์ดํดํ์ญ์์ค.
3๋จ๊ณ: ์ ์ฑ ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์
์๋ฐ ๋ณด๊ณ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก CSP ์ง์๋ฌธ์ ์ ์ง์ ์ผ๋ก ์กฐ์ ํฉ๋๋ค. ๋ชฉํ๋ ์ ์ฌ์ ์ผ๋ก ์ ์์ ์ธ ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํ๋ฉด์ ๋ชจ๋ ํฉ๋ฒ์ ์ธ ๋ฆฌ์์ค๋ฅผ ํ์ฉํ๋ ์ ์ฑ ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์ผ๋ฐ์ ์ธ ์กฐ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํน์ ์ 3์ ๋๋ฉ์ธ ํ์ฉ: ํฉ๋ฒ์ ์ธ ์ 3์ ์คํฌ๋ฆฝํธ(์: ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ CDN)๊ฐ ์ฐจ๋จ๋ ๊ฒฝ์ฐ ํด๋น ๋๋ฉ์ธ์
script-src์ง์๋ฌธ์ ์ถ๊ฐํฉ๋๋ค. ์:script-src 'self' https://cdnjs.cloudflare.com; - ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ์ฒ๋ฆฌ: ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์ต์
์ด ์์ต๋๋ค. ๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ๋ณ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ์ฆ์ ๊ฐ๋ฅํ์ง ์์ ๊ฒฝ์ฐ:
- ๋
ผ์ค(nonce, number used once) ์ฌ์ฉ: ๊ฐ ์์ฒญ์ ๋ํด ๊ณ ์ ํ๊ณ ์์ธก ๋ถ๊ฐ๋ฅํ ํ ํฐ(๋
ผ์ค)์ ์์ฑํ๊ณ ์ด๋ฅผ
script-src์ง์๋ฌธ์ ํฌํจํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์nonce-์์ฑ์<script>ํ๊ทธ์ ์ถ๊ฐํฉ๋๋ค. ์:script-src 'self' 'nonce-random123';๋ฐ<script nonce="random123">alert('hello');</script>. - ํด์ ์ฌ์ฉ: ๋ณ๊ฒฝ๋์ง ์๋ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ์ ๊ฒฝ์ฐ ์คํฌ๋ฆฝํธ ๋ด์ฉ์ ์ํธํ ํด์(์: SHA-256)๋ฅผ ์์ฑํ์ฌ
script-src์ง์๋ฌธ์ ํฌํจํ ์ ์์ต๋๋ค. ์:script-src 'self' 'sha256-somehashvalue';. 'unsafe-inline'(์ตํ์ ์๋จ): ์ธ๊ธํ๋ฏ์ด ์ด๊ฒ์ ๋ณด์์ ์ฝํ์ํต๋๋ค. ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ์์ ์กฐ์น๋ก ์ฌ์ฉํ์ญ์์ค.
- ๋
ผ์ค(nonce, number used once) ์ฌ์ฉ: ๊ฐ ์์ฒญ์ ๋ํด ๊ณ ์ ํ๊ณ ์์ธก ๋ถ๊ฐ๋ฅํ ํ ํฐ(๋
ผ์ค)์ ์์ฑํ๊ณ ์ด๋ฅผ
eval()์ฒ๋ฆฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ดeval()๋๋ ์ ์ฌํ ํจ์์ ์์กดํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ํผํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํฉ๋๋ค. ํผํ ์ ์๋ ๊ฒฝ์ฐ'unsafe-eval'์ ํฌํจํด์ผ ํ์ง๋ง ์ด๋ ๋งค์ฐ ๊ถ์ฅ๋์ง ์์ต๋๋ค.- ์ด๋ฏธ์ง, ์คํ์ผ ๋ฑ ํ์ฉ: ๋ง์ฐฌ๊ฐ์ง๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ํ์์ ๋ฐ๋ผ
img-src,style-src,font-src๋ฑ์ ์กฐ์ ํฉ๋๋ค.
4๋จ๊ณ: ๊ฐ์ ๋ชจ๋๋ก ์ ํ
CSP ์ ์ฑ
์ด ํฉ๋ฒ์ ์ธ ๊ธฐ๋ฅ์ ์์์ํค์ง ์๊ณ ์ ์ฌ์ ์ธ ์ํ์ ํจ๊ณผ์ ์ผ๋ก ๋ณด๊ณ ํ๋ค๊ณ ํ์ ํ๋ฉด Content-Security-Policy-Report-Only ํค๋์์ Content-Security-Policy ํค๋๋ก ์ ํํฉ๋๋ค.
๊ฐ์ ํค๋์ ์:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline'; img-src *;
๋ ์ด์ ๋ณด๊ณ ์๋ฅผ ๋ฐ๊ธฐ๋ฅผ ์ํ์ง ์๋ ๊ฒฝ์ฐ ๊ฐ์ ํค๋์์ report-uri ๋๋ report-to ์ง์๋ฌธ์ ์ ๊ฑฐํ๊ฑฐ๋ ๋นํ์ฑํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค(ํ์ง๋ง ๋ชจ๋ํฐ๋ง์ ์ํด ์ ์งํ๋ ๊ฒ์ด ์ฌ์ ํ ์ ์ฉํ ์ ์์ต๋๋ค).
5๋จ๊ณ: ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ์ง๋ณด์
๋ณด์์ ์ผํ์ฑ ์ค์ ์ด ์๋๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ ํ๊ณ , ์๋ก์ด ์คํฌ๋ฆฝํธ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋, ์ 3์ ์ข ์์ฑ์ด ์ ๋ฐ์ดํธ๋จ์ ๋ฐ๋ผ CSP๋ฅผ ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๊ณ์ ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์ ์ฑ ์ ์ ๋ฐ์ดํธํ์ญ์์ค.
๊ณ ๊ธ CSP ๊ธฐ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ ๋์ด์, CSP๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๋์ฑ ๊ฐํํ ์ ์๋ ์ฌ๋ฌ ๊ณ ๊ธ ๊ธฐ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
1. ๋จ๊ณ์ ๋ฐฐํฌ
ํฌ๊ฑฐ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ CSP์ ๋จ๊ณ์ ๋ฐฐํฌ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ํ์ฉ์ ์ธ ์ ์ฑ ์ผ๋ก ์์ํ์ฌ ์ ์ฐจ์ ์ผ๋ก ๊ฐํํ์ญ์์ค. ๋ํ ์ ์ฒด ๊ธ๋ก๋ฒ ๊ฐ์ ์ํ ์ ์ ํน์ ์ฌ์ฉ์ ์ธ๊ทธ๋จผํธ๋ ์ง์ญ์ ๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋๋ก CSP๋ฅผ ๋ฐฐํฌํ ์๋ ์์ต๋๋ค.
2. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฒด ํธ์คํ
CDN์ ํธ๋ฆฌํ์ง๋ง ์ 3์ ์ํ์ ๋ํ๋ ๋๋ค. CDN์ด ์์๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํฅ์ ๋ฐ์ ์ ์์ต๋๋ค. ํ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฒด ๋๋ฉ์ธ์์ HTTPS๋ฅผ ํตํด ์ ๊ณตํ๋ฉด CSP๋ฅผ ๋จ์ํํ๊ณ ์ธ๋ถ ์ข ์์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
3. `frame-ancestors` ํ์ฉ
frame-ancestors ์ง์๋ฌธ์ ํด๋ฆญ์ฌํน์ ๋ฐฉ์งํ๋ ํ๋์ ์ด๊ณ ์ ํธ๋๋ ๋ฐฉ๋ฒ์
๋๋ค. X-Frame-Options์๋ง ์์กดํ๋ ๋์ CSP์์ frame-ancestors๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์:
Content-Security-Policy: frame-ancestors 'self' https://partner.example.com;
์ด๋ฅผ ํตํด ํ์ด์ง๋ ์์ฒด ๋๋ฉ์ธ๊ณผ ํน์ ํํธ๋ ๋๋ฉ์ธ์์๋ง ํฌํจ๋ ์ ์์ต๋๋ค.
4. API ํธ์ถ์ `connect-src` ์ฌ์ฉ
connect-src ์ง์๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฐ๊ฒฐ(์: fetch, XMLHttpRequest, WebSocket ์ฌ์ฉ)ํ ์ ์๋ ์์น๋ฅผ ์ ์ดํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ ์ถ์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
์:
Content-Security-Policy: default-src 'self'; connect-src 'self' api.internal.example.com admin.external.com;
์ด๋ ๋ด๋ถ API์ ํน์ ์ธ๋ถ ๊ด๋ฆฌ ์๋น์ค์๋ง API ํธ์ถ์ ํ์ฉํฉ๋๋ค.
5. CSP ๋ ๋ฒจ 2 ์ด์
CSP๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ฐ์ ํ์ต๋๋ค. CSP ๋ ๋ฒจ 2๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๋์ ํ์ต๋๋ค:
- ์คํฌ๋ฆฝํธ/์คํ์ผ์ ๋ํ ํค์๋๋ก์์ `unsafe-inline` ๋ฐ `unsafe-eval`: ์ธ๋ผ์ธ ์คํ์ผ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ๋ ๋ฐ ๋ํ ๋ช ํ์ฑ.
- `report-to` ์ง์๋ฌธ: ๋ ์ ์ฐํ ๋ณด๊ณ ๋ฉ์ปค๋์ฆ.
- `child-src` ์ง์๋ฌธ: ์น ์์ปค ๋ฐ ์ ์ฌํ ํฌํจ๋ ์ฝํ ์ธ ์ ์์ค๋ฅผ ์ ์ดํฉ๋๋ค.
CSP ๋ ๋ฒจ 3์ ๊ณ์ํด์ ๋ ๋ง์ ์ง์๋ฌธ๊ณผ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค. ์ต์ ์ฌ์์ ์ต์ ์ํ๋ก ์ ์งํ๋ฉด ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ณด์ ์กฐ์น๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
6. ์๋ฒ ์ธก ํ๋ ์์ํฌ์ CSP ํตํฉ
๋๋ถ๋ถ์ ์ต์ ์น ํ๋ ์์ํฌ๋ CSP๋ฅผ ํฌํจํ HTTP ํค๋ ์ค์ ์ ์ํ ๋ฏธ๋ค์จ์ด๋ ๊ตฌ์ฑ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ์:
- Node.js (Express): `helmet`๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ.
- Python (Django/Flask): ๋ทฐ ํจ์์ ํค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ํน์ ๋ฏธ๋ค์จ์ด ์ฌ์ฉ.
- Ruby on Rails: `config/initializers/content_security_policy.rb` ๊ตฌ์ฑ.
- PHP: `header()` ํจ์ ๋๋ ํ๋ ์์ํฌ๋ณ ๊ตฌ์ฑ ์ฌ์ฉ.
ํญ์ ํ๋ ์์ํฌ์ ๋ฌธ์์์ ๊ถ์ฅํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฐธ์กฐํ์ญ์์ค.
7. ๋์ ์ฝํ ์ธ ๋ฐ ํ๋ ์์ํฌ ์ฒ๋ฆฌ
์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ(React, Vue, Angular)๋ ์ข ์ข ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ก ์ธํด ํนํ ์ธ๋ผ์ธ ์คํ์ผ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๊ด๋ จํ์ฌ CSP ๊ตฌํ์ด ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ๋ ์์ํฌ์ ๋ํ ๊ถ์ฅ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ณ๋์ CSS ํ์ผ์ ์ฌ์ฉํ๊ฑฐ๋ ์คํ์ผ๋ง ๋ฐ ์ด๋ฒคํธ ๋ฐ์ธ๋ฉ์ ์ํ ํ๋ ์์ํฌ๋ณ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์ธ๋ผ์ธ ์คํ์ผ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ต๋ํ ํผํฉ๋๋ค.
- ์ ๋์ ์ผ๋ก ํผํ ์ ์๋ ๊ฒฝ์ฐ ๋์ ์ผ๋ก ์์ฑ๋ ์คํฌ๋ฆฝํธ ํ๊ทธ์ ๋ํด ๋ ผ์ค ๋๋ ํด์๋ฅผ ํ์ฉํฉ๋๋ค.
- ํ๋ ์์ํฌ์ ๋น๋ ํ๋ก์ธ์ค๊ฐ CSP์ ํจ๊ป ์๋ํ๋๋ก ๊ตฌ์ฑ๋์๋์ง ํ์ธํฉ๋๋ค(์: ์คํฌ๋ฆฝํธ ํ๊ทธ์ ๋ ผ์ค๋ฅผ ์ฃผ์ ํ ์ ์๋๋ก ํ์ฉ).
์๋ฅผ ๋ค์ด React๋ฅผ ์ฌ์ฉํ ๋ ์๋ฒ๊ฐ `index.html` ํ์ผ์ ๋ ผ์ค๋ฅผ ์ฃผ์ ํ๋๋ก ๊ตฌ์ฑํ ๋ค์ ๋์ ์ผ๋ก ์์ฑ๋ ์คํฌ๋ฆฝํธ ํ๊ทธ์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด ํด๋น ๋ ผ์ค๋ฅผ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฌํด์ผ ํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ
CSP๋ฅผ ๊ตฌํํ๋ฉด ๋๋๋ก ์๊ธฐ์น ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค:
- ์ง๋์น๊ฒ ์ ํ์ ์ธ ์ ์ฑ : ํ์ ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํฉ๋๋ค. ํด๊ฒฐ์ฑ : ๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์์ ์์ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์คํ๊ฒ ๊ฐ์ฌํฉ๋๋ค.
- ํ์ ์์ด
'unsafe-inline'๋ฐ'unsafe-eval'์ฌ์ฉ: ์ด๋ ๋ณด์์ ํฌ๊ฒ ์ฝํ์ํต๋๋ค. ํด๊ฒฐ์ฑ : ๋ ผ์ค, ํด์ ๋๋ ๋ณ๋์ ํ์ผ์ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํฉ๋๋ค. - ๋ณด๊ณ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ์์: ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ์ค์ ํ์ง ์๊ฑฐ๋ ๋ณด๊ณ ์๋ฅผ ๋ฌด์ํฉ๋๋ค. ํด๊ฒฐ์ฑ : ๊ฐ๋ ฅํ ๋ณด๊ณ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๊ณ ์ ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํฉ๋๋ค.
- ํ์ ๋๋ฉ์ธ์ ์์ด๋ฒ๋ฆผ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ ๋๋ฉ์ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ CSP ๊ท์น์ด ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ๋ค๋ฃจ๋๋ก ํฉ๋๋ค. ํด๊ฒฐ์ฑ : ์์ผ๋์นด๋ ๋๋ฉ์ธ(์: `*.example.com`)์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ ํ์ ๋๋ฉ์ธ์ ๋์ดํฉ๋๋ค.
report-only์ ๊ฐ์ ํค๋ ํผ๋: ํ๋ก๋์ ์์report-only์ ์ฑ ์ ์ ์ฉํ๋ฉด ์ฌ์ดํธ๊ฐ ์์๋ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ : ๊ฐ์ ์ํ์ ํ์ฑํํ๊ธฐ ์ ์ ํญ์ ๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์์ ์ ์ฑ ์ ํ์ธํฉ๋๋ค.- ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฌด์: CSP๋ ๋๋ฆฌ ์ง์๋์ง๋ง ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ ์ง์๋ฌธ์ ์์ ํ ๊ตฌํํ์ง ์์ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ : ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ ๋ํ ํด๋ฐฑ ๋๋ ์ ์ง์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๊ณตํ๊ฑฐ๋, ์์ ํ CSP ๋ณดํธ๋ฅผ ๋ฐ์ง ๋ชปํ ์ ์๋ค๋ ์ ์ ๋ฐ์๋ค์ ๋๋ค.
CSP ๊ตฌํ์ ์ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ์ํด CSP๋ฅผ ๊ตฌํํ ๋ ๋ช ๊ฐ์ง ์ค์ํ ์์๊ฐ ์์ต๋๋ค:
- ๋ค์ํ ์ธํ๋ผ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ง์ญ์ ํธ์คํ ๋๊ฑฐ๋ ์ง์ญ CDN์ ์ฌ์ฉํ ์ ์์ต๋๋ค. CSP๊ฐ ๋ชจ๋ ๊ด๋ จ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ํ์ฉํ๋์ง ํ์ธํ์ญ์์ค.
- ๋ค์ํ ๊ท์ ๋ฐ ๊ท์ ์ค์: CSP๋ ๊ธฐ์ ์ ํต์ ์๋จ์ด์ง๋ง ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ (์: GDPR, CCPA)์ ์ธ์งํ๊ณ CSP ๊ตฌํ์ด ํนํ ์ 3์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ด๋ฌํ ๊ท์ ๊ณผ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค.
- ์ธ์ด ๋ฐ ํ์งํ: ๋์ ์ฝํ ์ธ ๋ ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ ๋ ์ฌ์ฉ์์ ์ธ์ด์ ๊ด๊ณ์์ด ์ฃผ์ ๊ณต๊ฒฉ์ ๋งค๊ฐ์ฒด๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ์์ ํ๊ฒ ์ฒ๋ฆฌ๋๋์ง ํ์ธํ์ญ์์ค.
- ๋ค์ํ ํ๊ฒฝ์์ ํ ์คํธ: ์ผ๊ด๋ ๋ณด์ ๋ฐ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด ๋ฐ ์ง๋ฆฌ์ ์์น์์ CSP ์ ์ฑ ์ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
๊ฒฐ๋ก
์ฝํ ์ธ ๋ณด์ ์ ์ฑ ์ XSS์ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ด๋ จ ์ํ์ผ๋ก๋ถํฐ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๋ ๊ฐ๋ ฅํ๊ณ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ๊ทธ ์ง์๋ฌธ์ ์ดํดํ๊ณ ์ฒด๊ณ์ ์ผ๋ก ๊ตฌํํ๋ฉฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํจ์ผ๋ก์จ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ์ํ๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ค์์ ๊ธฐ์ตํ์ญ์์ค:
- ๋ฆฌ์์ค๋ฅผ ๋ถ์ง๋ฐํ ๊ฐ์ฌํฉ๋๋ค.
- ์๋ฐ ์ฌํญ์ ์๋ณํ๊ธฐ ์ํด ๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์์ ์์ํฉ๋๋ค.
- ๋ณด์๊ณผ ๊ธฐ๋ฅ์ฑ์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ์ ์ฑ ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
- ๊ฐ๋ฅํ ๋๋ง๋ค
'unsafe-inline'๋ฐ'unsafe-eval'์ ํผํฉ๋๋ค. - ์ง์์ ์ธ ํจ๊ณผ๋ฅผ ์ํด CSP๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
CSP ๊ตฌํ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์๊ณผ ์ ๋ขฐ์ฑ์ ๋ํ ํฌ์์ ๋๋ค. ์ฌ์ ์๋ฐฉ์ ์ด๊ณ ์ฒด๊ณ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ทจํจ์ผ๋ก์จ ์ฌ์ฉ์์ ์กฐ์ง์ ์น์ ์์กดํ๋ ์ํ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๋ ํ๋ ฅ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์์ ํ๊ฒ ์ ์งํ์ธ์!