ํ๋ก ํธ์๋ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP) ์๋ฐ ๋ถ์์ ๋ํ ์ฌ์ธต ํ๊ตฌ. ๊ธ๋ก๋ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ์ด๋ฒคํธ ๋ถ์, ๋ชจ๋ํฐ๋ง ๋ฐ ์ํ ์ ๋ต์ ์ค์ ์ ๋ก๋๋ค.
ํ๋ก ํธ์๋ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP) ์๋ฐ ๋ถ์: ๋ณด์ ์ด๋ฒคํธ ๋ถ์
์ค๋๋ ์ ์ํ ํ๊ฒฝ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS)์ ํฌํจํ ๋ค์ํ ๊ณต๊ฒฉ์ ๋ํ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ์ด ์๋จ ์ค ํ๋๋ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ๋๋ค. CSP๋ XSS ๋ฐ ๋ฐ์ดํฐ ์ฃผ์ ๊ณต๊ฒฉ์ ํฌํจํ ํน์ ์ ํ์ ๊ณต๊ฒฉ์ ํ์งํ๊ณ ์ํํ๋ ๋ฐ ๋์์ด ๋๋ ์ถ๊ฐ์ ์ธ ๋ณด์ ๊ณ์ธต์ ๋๋ค. ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ฐ์ดํฐ ํ์ทจ๋ถํฐ ์ฌ์ดํธ ๋ณ์กฐ, ์ ์ฑ ์ฝ๋ ๋ฐฐํฌ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ง๋ง ๋จ์ํ CSP๋ฅผ ๊ตฌํํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ์ํ๋ฅผ ์ดํดํ๊ณ , ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ ์๋ณํ๋ฉฐ, ์ ์ฑ ์ ๋ฏธ์ธ ์กฐ์ ํ๊ธฐ ์ํด CSP ์๋ฐ์ ์ ๊ทน์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๋ถ์ํด์ผ ํฉ๋๋ค. ์ด ๊ธ์์๋ ๋ณด์ ์ด๋ฒคํธ ๋ถ์๊ณผ ์คํ ๊ฐ๋ฅํ ๊ฐ์ ์ ๋ต์ ์ด์ ์ ๋ง์ถฐ ํ๋ก ํธ์๋ CSP ์๋ฐ ๋ถ์์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ํ ๊ฐ๋ฐ ํ๊ฒฝ์์ CSP๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ธ๋ก๋ฒ ์ํฅ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ๊ตฌํ ๊ฒ์ ๋๋ค.
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ด๋ ๋ฌด์์ธ๊ฐ?
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ์น ๊ฐ๋ฐ์๊ฐ ์ฃผ์ด์ง ํ์ด์ง์ ๋ํด ์ฌ์ฉ์ ์์ด์ ํธ๊ฐ ๋ก๋ํ ์ ์๋ ๋ฆฌ์์ค๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ HTTP ์๋ต ํค๋๋ก ์ ์๋ ๋ณด์ ํ์ค์ ๋๋ค. ์ ๋ขฐํ ์ ์๋ ์์ค์ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์ ์ํจ์ผ๋ก์จ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฑ ์ฝํ ์ธ ๊ฐ ์ฃผ์ ๋ ์ํ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. CSP๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ง์ ๋ ์์ค์์๋ง ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ , ์ด๋ฏธ์ง, ์คํ์ผ์ํธ ๋ฐ ๊ธฐํ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋๋ก ์ง์ํ์ฌ ์๋ํฉ๋๋ค.
CSP์ ์ฃผ์ ์ง์๋ฌธ:
- `default-src`: ๋ค๋ฅธ fetch ์ง์๋ฌธ์ ๋ํ ๋์ฒด(fallback) ์ญํ ์ ํฉ๋๋ค. ํน์ ๋ฆฌ์์ค ์ ํ์ด ์ ์๋์ง ์์ ๊ฒฝ์ฐ ์ด ์ง์๋ฌธ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- `script-src`: JavaScript์ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `style-src`: CSS ์คํ์ผ์ํธ์ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `img-src`: ์ด๋ฏธ์ง์ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `connect-src`: fetch, XMLHttpRequest, ์น์์ผ ๋ฐ EventSource ์ฐ๊ฒฐ์ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `font-src`: ํฐํธ์ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `media-src`: ์ค๋์ค ๋ฐ ๋น๋์ค์ ๊ฐ์ ๋ฏธ๋์ด๋ฅผ ๋ก๋ํ๊ธฐ ์ํ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `object-src`: ํ๋์์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ ํจํ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค. (์ผ๋ฐ์ ์ผ๋ก ์ด ๊ฐ์ 'none'์ผ๋ก ์ค์ ํ์ฌ ํ๋ฌ๊ทธ์ธ์ ์์ ํ ๋นํ์ฑํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.)
- `base-uri`: ๋ฌธ์์ `
` ์์์ ์ฌ์ฉํ ์ ์๋ ์ ํจํ URL์ ์ง์ ํฉ๋๋ค. - `form-action`: ํผ ์ ์ถ์ ์ํ ์ ํจํ ์๋ํฌ์ธํธ๋ฅผ ์ง์ ํฉ๋๋ค.
- `frame-ancestors`: ``, `
- `report-uri` (์ฌ์ฉ ์ค๋จ๋จ): ๋ธ๋ผ์ฐ์ ๊ฐ CSP ์๋ฐ์ ๋ํ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด์ผ ํ๋ URL์ ์ง์ ํฉ๋๋ค. `report-to` ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
- `report-to`: ๋ธ๋ผ์ฐ์ ๊ฐ CSP ์๋ฐ์ ๋ํ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด๋ ๋ฐ ์ฌ์ฉํด์ผ ํ๋, `Report-To` ํค๋๋ฅผ ํตํด ๊ตฌ์ฑ๋ ๋ช ๋ช ๋ ์๋ํฌ์ธํธ๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ `report-uri`์ ํ๋์ ์ธ ๋์ฒด ์๋จ์ ๋๋ค.
- `upgrade-insecure-requests`: ์ฌ์ฉ์ ์์ด์ ํธ์๊ฒ ์ฌ์ดํธ์ ๋ชจ๋ ๋น๋ณด์ URL(HTTP๋ฅผ ํตํด ์ ๊ณต๋๋)์ ๋ณด์ URL(HTTPS๋ฅผ ํตํด ์ ๊ณต๋๋)๋ก ๋์ฒด๋ ๊ฒ์ฒ๋ผ ์ฒ๋ฆฌํ๋๋ก ์ง์ํฉ๋๋ค. ์ด ์ง์๋ฌธ์ HTTPS๋ก ์ ํํ๋ ์น์ฌ์ดํธ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
CSP ํค๋ ์์:
`Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-to csp-endpoint;`
์ด ์ ์ฑ ์ ๋์ผํ ์ถ์ฒ(`'self'`)์์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๊ณ , `https://example.com`์์ JavaScript๋ฅผ, ์ธ๋ผ์ธ ์คํ์ผ์, ๋์ผํ ์ถ์ฒ์ ๋ฐ์ดํฐ URI์์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋๋ก ํ์ฉํ๋ฉฐ, `csp-endpoint`๋ผ๋ ๋ณด๊ณ ์๋ํฌ์ธํธ(`Report-To` ํค๋๋ก ๊ตฌ์ฑ๋จ)๋ฅผ ์ง์ ํฉ๋๋ค.
CSP ์๋ฐ ๋ถ์์ด ์ค์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
์ ์ ํ๊ฒ ๊ตฌ์ฑ๋ CSP๋ ๋ณด์์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ง๋ง, ๊ทธ ํจ๊ณผ๋ ์๋ฐ ๋ณด๊ณ ์๋ฅผ ์ ๊ทน์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๋ถ์ํ๋ ๋ฐ ๋ฌ๋ ค ์์ต๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ๋ฌด์ํ๋ฉด ์๋ชป๋ ์๋๊ฐ์ ๋น ์ง๊ณ ์ค์ ์ทจ์ฝ์ ์ ํด๊ฒฐํ ๊ธฐํ๋ฅผ ๋์น ์ ์์ต๋๋ค. CSP ์๋ฐ ๋ถ์์ด ์ค์ํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- XSS ์๋ ์๋ณ: CSP ์๋ฐ์ ์ข ์ข ์๋๋ XSS ๊ณต๊ฒฉ์ ๋ํ๋ ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ๋ฉด ํด๋ฅผ ๋ผ์น๊ธฐ ์ ์ ์ ์์ ์ธ ํ๋์ ํ์งํ๊ณ ๋์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ ์ฑ ์ฝ์ ๋ฐ๊ฒฌ: ์๋ฐ ๋ณด๊ณ ์๋ CSP ๊ตฌ์ฑ์ ํ์ ์ ๋๋ฌ๋ ๋๋ค. ์ด๋ค ๋ฆฌ์์ค๊ฐ ์ฐจ๋จ๋๊ณ ์๋์ง ์๋ณํจ์ผ๋ก์จ ํฉ๋ฒ์ ์ธ ๊ธฐ๋ฅ์ ์์์ํค์ง ์์ผ๋ฉด์ ์ ์ฑ ์ ๋ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฌ์ ์ ์์ต๋๋ค.
- ํฉ๋ฒ์ ์ธ ์ฝ๋ ๋ฌธ์ ๋๋ฒ๊น : ๋๋ก๋ ์๋์น ์๊ฒ CSP๋ฅผ ์๋ฐํ๋ ํฉ๋ฒ์ ์ธ ์ฝ๋๋ก ์ธํด ์๋ฐ์ด ๋ฐ์ํ๊ธฐ๋ ํฉ๋๋ค. ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ์๊ฐ ์ค์๋ก ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ CSS ๊ท์น์ ํฌํจํ์ฌ ์๊ฒฉํ CSP์ ์ํด ์ฐจ๋จ๋ ์ ์์ต๋๋ค.
- ์๋ํํฐ ํตํฉ ๋ชจ๋ํฐ๋ง: ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์๋น์ค๋ ๋ณด์ ์ํ์ ์ด๋ํ ์ ์์ต๋๋ค. CSP ์๋ฐ ๋ณด๊ณ ์๋ ์ด๋ฌํ ํตํฉ์ ๋์์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ณ ๋ณด์ ์ ์ฑ ์ ์ค์ํ๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ํ์ฌ ๋ง์ ์กฐ์ง์์๋ ๋ณด์ ํ๊ฐ์ ์ผํ์ผ๋ก ์๋ํํฐ ๊ณต๊ธ์ ์ฒด์ CSP ์ค์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์๊ตฌํฉ๋๋ค.
- ๊ท์ ์ค์ ๋ฐ ๊ฐ์ฌ: ๋ง์ ๊ท์ ๋ฐ ์ฐ์ ํ์ค์ ๊ฐ๋ ฅํ ๋ณด์ ์กฐ์น๋ฅผ ์๊ตฌํฉ๋๋ค. CSP ๋ฐ ๊ทธ ๋ชจ๋ํฐ๋ง์ ๊ท์ ์ค์๋ฅผ ์ ์ฆํ๋ ํต์ฌ ๊ตฌ์ฑ ์์๊ฐ ๋ ์ ์์ต๋๋ค. CSP ์๋ฐ ๊ธฐ๋ก๊ณผ ๊ทธ์ ๋ํ ๋์ ๊ธฐ๋ก์ ์ ์งํ๋ ๊ฒ์ ๋ณด์ ๊ฐ์ฌ ์ค์ ๊ฐ์น๊ฐ ์์ต๋๋ค.
CSP ๋ณด๊ณ ์ค์ ํ๊ธฐ
CSP ์๋ฐ์ ๋ถ์ํ๊ธฐ ์ ์, ์ง์ ๋ ์๋ํฌ์ธํธ๋ก ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด๋๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ต์ CSP ๋ณด๊ณ ๋ ๋ ํฐ ์ ์ฐ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ์ ๊ณตํ๋ `Report-To` ํค๋๋ฅผ ํ์ฉํ๋ฉฐ, ์ด๋ ์ฌ์ฉ์ด ์ค๋จ๋ `report-uri` ์ง์๋ฌธ๋ณด๋ค ์ฐ์ํฉ๋๋ค.
1๋จ๊ณ: `Report-To` ํค๋ ๊ตฌ์ฑํ๊ธฐ:
`Report-To` ํค๋๋ ํ๋ ์ด์์ ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ ์๋ํฌ์ธํธ๋ ์ด๋ฆ, URL ๋ฐ ์ ํ์ ๋ง๋ฃ ์๊ฐ์ ๊ฐ์ง๋๋ค.
์์:
`Report-To: {"group":"csp-endpoint","max_age":31536000,"endpoints":[{"url":"https://your-reporting-service.com/csp-report"}],"include_subdomains":true}`
- `group`: ๋ณด๊ณ ์๋ํฌ์ธํธ์ ์ด๋ฆ์ ๋๋ค(์: "csp-endpoint"). ์ด ์ด๋ฆ์ CSP ํค๋์ `report-to` ์ง์๋ฌธ์์ ์ฐธ์กฐ๋ฉ๋๋ค.
- `max_age`: ์๋ํฌ์ธํธ ๊ตฌ์ฑ์ ์๋ช (์ด ๋จ์)์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด ๊ธฐ๊ฐ ๋์ ์๋ํฌ์ธํธ ๊ตฌ์ฑ์ ์บ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฐ์ 31536000์ด(1๋ )์ ๋๋ค.
- `endpoints`: ์๋ํฌ์ธํธ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๋๋ค. ๊ฐ ๊ฐ์ฒด๋ ๋ณด๊ณ ์๊ฐ ์ ์ก๋ URL์ ์ง์ ํฉ๋๋ค. ์ค๋ณต์ฑ์ ์ํด ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- `include_subdomains` (์ ํ ์ฌํญ): `true`๋ก ์ค์ ํ๋ฉด ๋ณด๊ณ ๊ตฌ์ฑ์ด ํด๋น ๋๋ฉ์ธ์ ๋ชจ๋ ํ์ ๋๋ฉ์ธ์ ์ ์ฉ๋ฉ๋๋ค.
2๋จ๊ณ: `Content-Security-Policy` ํค๋ ๊ตฌ์ฑํ๊ธฐ:
`Content-Security-Policy` ํค๋๋ CSP ์ ์ฑ ์ ์ ์ํ๊ณ `Report-To` ํค๋์ ์ ์๋ ๋ณด๊ณ ์๋ํฌ์ธํธ๋ฅผ ์ฐธ์กฐํ๋ `report-to` ์ง์๋ฌธ์ ํฌํจํฉ๋๋ค.
์์:
`Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; report-to csp-endpoint;`
3๋จ๊ณ: ๋ณด๊ณ ์๋ํฌ์ธํธ ์ค์ ํ๊ธฐ:
CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํ๋ ์๋ฒ ์ธก ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด ์๋ํฌ์ธํธ๋ JSON ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ถ์์ ์ํด ๋ณด๊ณ ์๋ฅผ ์ ์ฅํ ์ ์์ด์ผ ํฉ๋๋ค. ์ ํํ ๊ตฌํ์ ์๋ฒ ์ธก ๊ธฐ์ (์: Node.js, Python, Java)์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์์ (Node.js์ Express ์ฌ์ฉ):
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.post('/csp-report', (req, res) => {
const report = req.body['csp-report'];
console.log('CSP ์๋ฐ ๋ณด๊ณ ์:', report);
// ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ก๊ทธ ํ์ผ์ ๋ณด๊ณ ์ ์ ์ฅ
res.status(204).end(); // 204 No Content ์ํ๋ก ์๋ต
});
const port = 3000;
app.listen(port, () => {
console.log(`${port}๋ฒ ํฌํธ์์ ์๋ฒ๊ฐ ์์ ๋๊ธฐ ์ค์
๋๋ค`);
});
4๋จ๊ณ: ํ ์คํธ๋ฅผ ์ํด `Content-Security-Policy-Report-Only` ๊ณ ๋ คํ๊ธฐ:
CSP๋ฅผ ์ํํ๊ธฐ ์ ์ ๋ณด๊ณ ์ ์ฉ ๋ชจ๋์์ ํ ์คํธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์๋ฐ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. `Content-Security-Policy` ๋์ `Content-Security-Policy-Report-Only` ํค๋๋ฅผ ์ฌ์ฉํ์ธ์. ์๋ฐ ์ฌํญ์ ๋ณด๊ณ ์๋ํฌ์ธํธ๋ก ๋ณด๊ณ ๋์ง๋ง ๋ธ๋ผ์ฐ์ ๋ ์ ์ฑ ์ ๊ฐ์ ํ์ง ์์ต๋๋ค.
์์:
`Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://example.com; report-to csp-endpoint;`
CSP ์๋ฐ ๋ณด๊ณ ์ ๋ถ์ํ๊ธฐ
CSP ๋ณด๊ณ ๋ฅผ ์ค์ ํ๋ฉด ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ฐ๊ธฐ ์์ํฉ๋๋ค. ์ด ๋ณด๊ณ ์๋ ์๋ฐ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ JSON ๊ฐ์ฒด์ ๋๋ค. ๋ณด๊ณ ์์ ๊ตฌ์กฐ๋ CSP ์ฌ์์ ์ํด ์ ์๋ฉ๋๋ค.
CSP ์๋ฐ ๋ณด๊ณ ์ ์์:
{
"csp-report": {
"document-uri": "https://example.com/page.html",
"referrer": "https://attacker.com",
"violated-directive": "script-src 'self' https://example.com",
"effective-directive": "script-src",
"original-policy": "default-src 'self'; script-src 'self' https://example.com; report-to csp-endpoint;",
"disposition": "report",
"blocked-uri": "https://attacker.com/evil.js",
"status-code": 200,
"script-sample": "",
"source-file": "https://attacker.com/evil.js",
"line-number": 1,
"column-number": 1
}
}
CSP ์๋ฐ ๋ณด๊ณ ์์ ์ฃผ์ ํ๋:
- `document-uri`: ์๋ฐ์ด ๋ฐ์ํ ๋ฌธ์์ URI์ ๋๋ค.
- `referrer`: ์ฐธ์กฐ ํ์ด์ง์ URI์ ๋๋ค(์๋ ๊ฒฝ์ฐ).
- `violated-directive`: ์๋ฐ๋ CSP ์ง์๋ฌธ์ ๋๋ค.
- `effective-directive`: ๋์ฒด ๋ฉ์ปค๋์ฆ์ ๊ณ ๋ คํ์ฌ ์ค์ ๋ก ์ ์ฉ๋ ์ง์๋ฌธ์ ๋๋ค.
- `original-policy`: ์ ์ฉ๋์๋ ์ ์ฒด CSP ์ ์ฑ ์ ๋๋ค.
- `disposition`: ์๋ฐ์ด ๊ฐ์ ๋์๋์ง(`"enforce"`) ๋๋ ๋ณด๊ณ ๋ง ๋์๋์ง(`"report"`)๋ฅผ ๋ํ๋ ๋๋ค.
- `blocked-uri`: ์ฐจ๋จ๋ ๋ฆฌ์์ค์ URI์ ๋๋ค.
- `status-code`: ์ฐจ๋จ๋ ๋ฆฌ์์ค์ HTTP ์ํ ์ฝ๋์ ๋๋ค.
- `script-sample`: ์ฐจ๋จ๋ ์คํฌ๋ฆฝํธ์ ์ผ๋ถ์ ๋๋ค(ํด๋นํ๋ ๊ฒฝ์ฐ). ๋ธ๋ผ์ฐ์ ๋ ๋ณด์์์ ์ด์ ๋ก ์คํฌ๋ฆฝํธ ์ํ์ ์ผ๋ถ๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
- `source-file`: ์๋ฐ์ด ๋ฐ์ํ ์์ค ํ์ผ์ ๋๋ค(์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ).
- `line-number`: ์๋ฐ์ด ๋ฐ์ํ ์์ค ํ์ผ์ ์ค ๋ฒํธ์ ๋๋ค.
- `column-number`: ์๋ฐ์ด ๋ฐ์ํ ์์ค ํ์ผ์ ์ด ๋ฒํธ์ ๋๋ค.
ํจ๊ณผ์ ์ธ ๋ณด์ ์ด๋ฒคํธ ๋ถ์์ ์ํ ๋จ๊ณ
CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ๋ ๊ฒ์ ๊ตฌ์กฐํ๋ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํ ์ง์์ ์ธ ํ๋ก์ธ์ค์ ๋๋ค. CSP ์๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณด์ ์ด๋ฒคํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถ์ํ๊ธฐ ์ํ ๋จ๊ณ๋ณ ๊ฐ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฌ๊ฐ๋์ ๋ฐ๋ผ ๋ณด๊ณ ์ ์ฐ์ ์์ ์ง์ : ์ ์ฌ์ ์ธ XSS ๊ณต๊ฒฉ์ด๋ ๊ธฐํ ์ฌ๊ฐํ ๋ณด์ ์ํ์ ๋ํ๋ด๋ ์๋ฐ์ ์ง์คํ์ธ์. ์๋ฅผ ๋ค์ด, ์ ์ ์๊ฑฐ๋ ์ ๋ขฐํ ์ ์๋ ์์ค๋ก๋ถํฐ์ ์ฐจ๋จ๋ URI๊ฐ ์๋ ์๋ฐ์ ์ฆ์ ์กฐ์ฌํด์ผ ํฉ๋๋ค.
- ๊ทผ๋ณธ ์์ธ ์๋ณ: ์๋ฐ์ด ๋ฐ์ํ ์ด์ ๋ฅผ ํ์ ํ์ธ์. ์๋ชป๋ ๊ตฌ์ฑ์ผ๋ก ์ธํด ์ฐจ๋จ๋ ํฉ๋ฒ์ ์ธ ๋ฆฌ์์ค์ธ๊ฐ์, ์๋๋ฉด ์คํ์ ์๋ํ๋ ์ ์ฑ ์คํฌ๋ฆฝํธ์ธ๊ฐ์? `blocked-uri`, `violated-directive`, `referrer` ํ๋๋ฅผ ๋ณด๊ณ ์๋ฐ์ ๋งฅ๋ฝ์ ์ดํดํ์ธ์.
- ์๋ฐ ์ ํ ๋ถ๋ฅ: ์๋ฐ์ ๊ทผ๋ณธ ์์ธ์ ๋ฐ๋ผ ๋ฒ์ฃผ๋ก ๊ทธ๋ฃนํํ์ธ์. ์ด๋ ํจํด์ ์๋ณํ๊ณ ํด๊ฒฐ ๋ ธ๋ ฅ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฒ์ฃผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ชป๋ ๊ตฌ์ฑ: ์๋ชป๋ CSP ์ง์๋ฌธ ๋๋ ๋๋ฝ๋ ์์ธ๋ก ์ธํด ๋ฐ์ํ ์๋ฐ.
- ํฉ๋ฒ์ ์ธ ์ฝ๋ ๋ฌธ์ : ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์คํ์ผ ๋๋ CSP๋ฅผ ์๋ฐํ๋ ์ฝ๋๋ก ์ธํด ๋ฐ์ํ ์๋ฐ.
- ์๋ํํฐ ๋ฌธ์ : ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋น์ค๋ก ์ธํด ๋ฐ์ํ ์๋ฐ.
- XSS ์๋: ์ ์ฌ์ ์ธ XSS ๊ณต๊ฒฉ์ ๋ํ๋ด๋ ์๋ฐ.
- ์์ฌ์ค๋ฌ์ด ํ๋ ์กฐ์ฌ: ์๋ฐ์ด XSS ์๋๋ก ๋ณด์ด๋ ๊ฒฝ์ฐ ์ฒ ์ ํ ์กฐ์ฌํ์ธ์. `referrer`, `blocked-uri`, `script-sample` ํ๋๋ฅผ ๋ณด๊ณ ๊ณต๊ฒฉ์์ ์๋๋ฅผ ํ์ ํ์ธ์. ์๋ฒ ๋ก๊ทธ ๋ฐ ๊ธฐํ ๋ณด์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ์์ ๊ด๋ จ ํ๋์ ํ์ธํ์ธ์.
- ์๋ฐ ํด๊ฒฐ: ๊ทผ๋ณธ ์์ธ์ ๋ฐ๋ผ ์๋ฐ์ ํด๊ฒฐํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ์ทจํ์ธ์. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- CSP ์ ๋ฐ์ดํธ: ์ฐจ๋จ๋ ํฉ๋ฒ์ ์ธ ๋ฆฌ์์ค๋ฅผ ํ์ฉํ๋๋ก CSP๋ฅผ ์์ ํ์ธ์. ์ ์ฑ ์ ๋ถํ์ํ๊ฒ ์ฝํ์ํค์ง ์๋๋ก ์ฃผ์ํ์ธ์.
- ์ฝ๋ ์์ : ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์คํ์ผ์ ์ ๊ฑฐํ๊ฑฐ๋ CSP๋ฅผ ์ค์ํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ์ธ์.
- ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฐ์ดํธ: ๋ณด์ ์์ ์ฌํญ์ด ํฌํจ๋ ์ ์๋ ์ต์ ๋ฒ์ ์ผ๋ก ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ์ธ์.
- ์ ์์ ์ธ ํ๋ ์ฐจ๋จ: ์๋ฐ ๋ณด๊ณ ์์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์์ ์ธ ์์ฒญ์ด๋ ์ฌ์ฉ์๋ฅผ ์ฐจ๋จํ์ธ์.
- ๋ณ๊ฒฝ ์ฌํญ ํ ์คํธ: CSP ๋๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ์๋ก์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์๋์ง ํ์ธํ์ธ์. `Content-Security-Policy-Report-Only` ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ํ์ง ์๋ ๋ชจ๋์์ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ์ธ์.
- ๊ฒฐ๊ณผ ๋ฌธ์ํ: ์๋ฐ, ๊ทผ๋ณธ ์์ธ ๋ฐ ์ทจํ ํด๊ฒฐ ์กฐ์น๋ฅผ ๋ฌธ์ํํ์ธ์. ์ด ์ ๋ณด๋ ํฅํ ๋ถ์ ๋ฐ ๊ท์ ์ค์ ๋ชฉ์ ์ ์ ์ฉํ ๊ฒ์ ๋๋ค.
- ๋ถ์ ํ๋ก์ธ์ค ์๋ํ: CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ๊ธฐ ์ํด ์๋ํ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ด๋ฌํ ๋๊ตฌ๋ ํจํด์ ์๋ณํ๊ณ , ์๋ฐ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ฉฐ, ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์๋๋ฆฌ์ค
CSP ์๋ฐ ๋ณด๊ณ ์ ๋ถ์ ๊ณผ์ ์ ์ค๋ช ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์๋๋ฆฌ์ค 1: ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ์ฐจ๋จ
์๋ฐ ๋ณด๊ณ ์:
{
"csp-report": {
"document-uri": "https://example.com/page.html",
"violated-directive": "script-src 'self' https://example.com",
"blocked-uri": "inline",
"script-sample": ""
}
}
๋ถ์:
์ด ์๋ฐ์ CSP๊ฐ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐจ๋จํ๊ณ ์์์ ๋ํ๋ ๋๋ค. ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์ข ์ข ๋ณด์ ์ํ์ผ๋ก ๊ฐ์ฃผ๋๋ฏ๋ก ์ด๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ๋๋ค. `script-sample` ํ๋๋ ์ฐจ๋จ๋ ์คํฌ๋ฆฝํธ์ ๋ด์ฉ์ ๋ณด์ฌ์ค๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ:
๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๋์ ํ์ผ๋ก ์ฎ๊ธฐ๊ณ ์ ๋ขฐํ ์ ์๋ ์์ค์์ ๋ก๋ํ๋ ๊ฒ์ ๋๋ค. ๋๋ ๋ ผ์ค(nonce)๋ ํด์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๋์ ํ์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ๋ณด๋ค ๋ ์์ ํฉ๋๋ค.
์๋๋ฆฌ์ค 2: ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐจ๋จ
์๋ฐ ๋ณด๊ณ ์:
{
"csp-report": {
"document-uri": "https://example.com/page.html",
"violated-directive": "script-src 'self' https://example.com",
"blocked-uri": "https://cdn.example.com/library.js"
}
}
๋ถ์:
์ด ์๋ฐ์ CSP๊ฐ `https://cdn.example.com`์ ํธ์คํ ๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐจ๋จํ๊ณ ์์์ ๋ํ๋ ๋๋ค. ์ด๋ ์๋ชป๋ ๊ตฌ์ฑ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์น ๋ณ๊ฒฝ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ:
CSP๋ฅผ ํ์ธํ์ฌ `https://cdn.example.com`์ด `script-src` ์ง์๋ฌธ์ ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์. ํฌํจ๋์ด ์๋ค๋ฉด ํด๋น URL์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ ํ ํธ์คํ ๋๊ณ ์๋์ง ํ์ธํ์ธ์. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ํ๋ค๋ฉด ๊ทธ์ ๋ฐ๋ผ CSP๋ฅผ ์ ๋ฐ์ดํธํ์ธ์.
์๋๋ฆฌ์ค 3: ์ ์ฌ์ ์ธ XSS ๊ณต๊ฒฉ
์๋ฐ ๋ณด๊ณ ์:
{
"csp-report": {
"document-uri": "https://example.com/page.html",
"referrer": "https://attacker.com",
"violated-directive": "script-src 'self' https://example.com",
"blocked-uri": "https://attacker.com/evil.js"
}
}
๋ถ์:
์ด ์๋ฐ์ ์ ์ฌ์ ์ธ XSS ๊ณต๊ฒฉ์ ๋ํ๋ด๋ฏ๋ก ๋ ์ฐ๋ ค์ค๋ฝ์ต๋๋ค. `referrer` ํ๋๋ ์์ฒญ์ด `https://attacker.com`์์ ์์๋์์์ ๋ณด์ฌ์ฃผ๊ณ , `blocked-uri` ํ๋๋ CSP๊ฐ ๋์ผํ ๋๋ฉ์ธ์์ ์จ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐจ๋จํ์์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ๊ณต๊ฒฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฑ ์ฝ๋๋ฅผ ์ฃผ์ ํ๋ ค๊ณ ์๋ํ๊ณ ์์์ ๊ฐ๋ ฅํ๊ฒ ์์ฌํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ:
์ฆ์ ์๋ฐ์ ์กฐ์ฌํ์ธ์. ์๋ฒ ๋ก๊ทธ์์ ๊ด๋ จ ํ๋์ ํ์ธํ์ธ์. ๊ณต๊ฒฉ์์ IP ์ฃผ์๋ฅผ ์ฐจ๋จํ๊ณ ํฅํ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ์ทจํ์ธ์. XSS ๊ณต๊ฒฉ์ ํ์ฉํ ์ ์๋ ์ ์ฌ์ ์ทจ์ฝ์ ์ ๋ํด ์ฝ๋๋ฅผ ๊ฒํ ํ์ธ์. ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์ถ๋ ฅ ์ธ์ฝ๋ฉ๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
CSP ์๋ฐ ๋ถ์ ๋๊ตฌ
์ฌ๋ฌ ๋๊ตฌ๊ฐ CSP ์๋ฐ ๋ณด๊ณ ์ ๋ถ์ ๊ณผ์ ์ ์๋ํํ๊ณ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค:
- ์ง๊ณ ๋ฐ ์๊ฐํ: ์ฌ๋ฌ ์์ค์์ ์๋ฐ ๋ณด๊ณ ์๋ฅผ ์ง๊ณํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ์ฌ ์ถ์ธ์ ํจํด์ ์๋ณํฉ๋๋ค.
- ํํฐ๋ง ๋ฐ ๊ฒ์: `document-uri`, `violated-directive`, `blocked-uri`์ ๊ฐ์ ๋ค์ํ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ณด๊ณ ์๋ฅผ ํํฐ๋งํ๊ณ ๊ฒ์ํฉ๋๋ค.
- ๊ฒฝ๊ณ : ์์ฌ์ค๋ฌ์ด ์๋ฐ์ด ๊ฐ์ง๋๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ ๋๋ค.
- ๋ณด๊ณ : ๊ท์ ์ค์ ๋ฐ ๊ฐ์ฌ ๋ชฉ์ ์ ์ํด CSP ์๋ฐ์ ๋ํ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ณด์ ์ ๋ณด ๋ฐ ์ด๋ฒคํธ ๊ด๋ฆฌ(SIEM) ์์คํ ๊ณผ ํตํฉ: ์ค์ ์ง์ค์ ๋ณด์ ๋ชจ๋ํฐ๋ง์ ์ํด CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ SIEM ์์คํ ์ผ๋ก ์ ๋ฌํฉ๋๋ค.
๋๋ฆฌ ์ฌ์ฉ๋๋ ์ผ๋ถ CSP ์๋ฐ ๋ถ์ ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Report URI: ์๋ฐ ๋ณด๊ณ ์์ ๋ํ ์์ธํ ๋ถ์ ๋ฐ ์๊ฐํ๋ฅผ ์ ๊ณตํ๋ ์ ์ฉ CSP ๋ณด๊ณ ์๋น์ค์ ๋๋ค.
- Sentry: CSP ์๋ฐ ๋ชจ๋ํฐ๋ง์๋ ์ฌ์ฉํ ์ ์๋ ์ธ๊ธฐ ์๋ ์ค๋ฅ ์ถ์ ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ํ๋ซํผ์ ๋๋ค.
- Google Security Analytics: ๋ค๋ฅธ ๋ณด์ ๋ฐ์ดํฐ์ ํจ๊ป CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ ์ ์๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋ณด์ ๋ถ์ ํ๋ซํผ์ ๋๋ค.
- ์์ฒด ์๋ฃจ์ : ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด CSP ์๋ฐ ๋ถ์ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ ์๋ ์์ต๋๋ค.
CSP ๊ตฌํ์ ์ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ํ๊ฒฝ์์ CSP๋ฅผ ๊ตฌํํ ๋๋ ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN): ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด CDN์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, CDN ๋๋ฉ์ธ์ด CSP์ ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์. CDN์ ์ข ์ข ์ง์ญ๋ณ ๋ณํ(์: ๋ถ๋ฏธ์ฉ `cdn.example.com`, ์ ๋ฝ์ฉ `cdn.example.eu`)์ด ์์ต๋๋ค. CSP๋ ์ด๋ฌํ ๋ณํ์ ์์ฉํด์ผ ํฉ๋๋ค.
- ์๋ํํฐ ์๋น์ค: ๋ง์ ์น์ฌ์ดํธ๊ฐ ๋ถ์ ๋๊ตฌ, ๊ด๊ณ ๋คํธ์ํฌ, ์์ ๋ฏธ๋์ด ์์ ฏ๊ณผ ๊ฐ์ ์๋ํํฐ ์๋น์ค์ ์์กดํฉ๋๋ค. ์ด๋ฌํ ์๋น์ค์์ ์ฌ์ฉํ๋ ๋๋ฉ์ธ์ด CSP์ ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์. ์๋ก์ด ๋๋ฉ์ธ์ด๋ ๋ณ๊ฒฝ๋ ๋๋ฉ์ธ์ ์๋ณํ๊ธฐ ์ํด ์๋ํํฐ ํตํฉ์ ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํ์ธ์.
- ํ์งํ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฌ ์ธ์ด ๋๋ ์ง์ญ์ ์ง์ํ๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๋ฆฌ์์ค๋ ๋๋ฉ์ธ์ ์์ฉํ๊ธฐ ์ํด CSP๋ฅผ ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ์ง์ญ CDN์์ ํฐํธ๋ ์ด๋ฏธ์ง๋ฅผ ํ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
- ์ง์ญ ๊ท์ : ์ผ๋ถ ๊ตญ๊ฐ์๋ ๋ฐ์ดํฐ ํ๋ผ์ด๋ฒ์ ๋ฐ ๋ณด์์ ๊ดํ ํน์ ๊ท์ ์ด ์์ต๋๋ค. CSP๊ฐ ์ด๋ฌํ ๊ท์ ์ ์ค์ํ๋์ง ํ์ธํ์ธ์. ์๋ฅผ ๋ค์ด, ์ ๋ฝ ์ฐํฉ์ ์ผ๋ฐ ๋ฐ์ดํฐ ๋ณดํธ ๊ท์ (GDPR)์ EU ์๋ฏผ์ ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋๋ก ์๊ตฌํฉ๋๋ค.
- ๋ค๋ฅธ ์ง์ญ์์์ ํ ์คํธ: ๋ค๋ฅธ ์ง์ญ์์ CSP๋ฅผ ํ ์คํธํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ํฉ๋ฒ์ ์ธ ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํ์ง ์๋์ง ํ์ธํ์ธ์. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์จ๋ผ์ธ CSP ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฑ ์ ํ์ธํ์ธ์.
CSP ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
CSP์ ์ง์์ ์ธ ํจ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์:
- ์๊ฒฉํ ์ ์ฑ ์ผ๋ก ์์ํ๊ธฐ: ์ ๋ขฐํ ์ ์๋ ์์ค์ ๋ฆฌ์์ค๋ง ํ์ฉํ๋ ์๊ฒฉํ ์ ์ฑ ์ผ๋ก ์์ํ์ธ์. ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์์ ๋ฐ๋ผ ์ ์ง์ ์ผ๋ก ์ ์ฑ ์ ์ํํ์ธ์.
- ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ฐ ์คํ์ผ์ ๋ ผ์ค ๋๋ ํด์ ์ฌ์ฉํ๊ธฐ: ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์คํ์ผ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ ผ์ค๋ ํด์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ธ์คํด์ค๋ฅผ ํ์ฉํ์ธ์. ์ด๋ ๋ชจ๋ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์คํ์ผ์ ํ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ์์ ํฉ๋๋ค.
- `unsafe-inline` ๋ฐ `unsafe-eval` ํผํ๊ธฐ: ์ด๋ฌํ ์ง์๋ฌธ์ CSP๋ฅผ ํฌ๊ฒ ์ฝํ์ํค๋ฏ๋ก ๊ฐ๋ฅํ ํ ํผํด์ผ ํฉ๋๋ค.
- ์ ๊ธฐ์ ์ผ๋ก CSP ๊ฒํ ๋ฐ ์ ๋ฐ์ดํธํ๊ธฐ: CSP๊ฐ ์ฌ์ ํ ํจ๊ณผ์ ์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์๋ํํฐ ํตํฉ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋์ง ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํ์ธ์.
- CSP ๋ฐฐํฌ ํ๋ก์ธ์ค ์๋ํํ๊ธฐ: ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ค๋ฅ ์ํ์ ์ค์ด๊ธฐ ์ํด CSP ๋ณ๊ฒฝ ์ฌํญ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ธ์.
- CSP ์๋ฐ ๋ณด๊ณ ์ ๋ชจ๋ํฐ๋งํ๊ธฐ: ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ์๋ณํ๊ณ ์ ์ฑ ์ ๋ฏธ์ธ ์กฐ์ ํ๊ธฐ ์ํด CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ธ์.
- ๊ฐ๋ฐํ ๊ต์กํ๊ธฐ: ๊ฐ๋ฐํ์๊ฒ CSP์ ๊ทธ ์ค์์ฑ์ ๋ํด ๊ต์กํ์ธ์. ๊ทธ๋ค์ด CSP๋ฅผ ์ค์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋๋ก ํ์ธ์.
CSP์ ๋ฏธ๋
์ฝํ ์ธ ๋ณด์ ์ ์ฑ ํ์ค์ ์๋ก์ด ๋ณด์ ๊ณผ์ ์ ๋์ํ๊ธฐ ์ํด ๋์์์ด ๋ฐ์ ํ๊ณ ์์ต๋๋ค. CSP์ ์๋ก์ด ๋ํฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Trusted Types: DOM์ ์ฝ์ ๋๋ ๋ฐ์ดํฐ๊ฐ ์ ์ ํ๊ฒ ์ด๊ท ๋๋๋ก ๋ณด์ฅํ์ฌ DOM ๊ธฐ๋ฐ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋๋ ์๋ก์ด API์ ๋๋ค.
- Feature Policy: ์น ํ์ด์ง์์ ์ฌ์ฉํ ์ ์๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ ์ ์ดํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณต๊ฒฉ ํ๋ฉด์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- Subresource Integrity (SRI): CDN์์ ๊ฐ์ ธ์จ ํ์ผ์ด ๋ณ์กฐ๋์ง ์์๋์ง ํ์ธํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ๋ ์ธ๋ถํ๋ ์ง์๋ฌธ: ๋ฆฌ์์ค ๋ก๋ฉ์ ๋ํ ๋ ๋ฏธ์ธํ ์ ์ด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ ๊ตฌ์ฒด์ ์ด๊ณ ์ธ๋ถํ๋ CSP ์ง์๋ฌธ์ ์ง์์ ์ธ ๊ฐ๋ฐ.
๊ฒฐ๋ก
ํ๋ก ํธ์๋ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ ์๋ฐ ๋ถ์์ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์ ํ์์ ์ธ ๊ตฌ์ฑ ์์์ ๋๋ค. CSP ์๋ฐ์ ์ ๊ทน์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๋ถ์ํจ์ผ๋ก์จ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ์๋ณํ๊ณ , ์ ์ฑ ์ ๋ฏธ์ธ ์กฐ์ ํ๋ฉฐ, ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ ์ ์์ต๋๋ค. CSP๋ฅผ ๊ตฌํํ๊ณ ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ถ์ง๋ฐํ ๋ถ์ํ๋ ๊ฒ์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์์ ํ๊ณ ์ ๋ขฐํ ์ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ์๋ํ ๋ฐ ํ ๊ต์ก์ ํฌํจํ CSP ๊ด๋ฆฌ์ ๋ํ ์ฌ์ ์๋ฐฉ์ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํ๋ฉด ์งํํ๋ ์ํ์ ๋ํ ๊ฐ๋ ฅํ ๋ฐฉ์ด๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋ณด์์ ์ง์์ ์ธ ํ๋ก์ธ์ค์ด๋ฉฐ CSP๋ ์ฌ๋ฌ๋ถ์ ๋ฌด๊ธฐ๊ณ ์์ ๊ฐ๋ ฅํ ๋๊ตฌ๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์.