์์ ์ ๋ฐํ ์๋ฃ๋ก ๋ง๋ค์๋ ๊ฒ ๋ณต์ต ๊ฒธ ์์ฑ
CSRF
CSRF์ ์ ์
Cross-Site Request Forgery, ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์์กฐ
- ๋ค๋ฅธ ์ฌ์ดํธ ๊ฐ์ ์์ฒญ์ ์์กฐํ๋ ๋ฐฉ๋ฒ
- ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ์ํ๋ก ๋ธ๋ผ์ฐ์ ์ ์ธ์ ์ ๋ณด๊ฐ ๋จ์ ์์ ๋, ์ฌ์ฉ์์ ์์ง์ ๋ฌด๊ดํ๊ฒ ๊ณต๊ฒฉ์๊ฐ ์๋ํ ์ ์์ ์ธ ์์ฒญ์ ์๋ฒ์ ์ ์กํ๊ฒ ํ์ฌ ์ฌ์ฉ์์ ๊ถํ์ ์ด์ฉํ๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ
CSRF์ ๊ณต๊ฒฉ ์๋ฆฌ
- CSRF ๊ณต๊ฒฉ์ ๋ํ ์ทจ์ฝ์ ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ์ฌ ๋จ์์๋ ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ฆ์ ๋ฌด๋ ฅํํ๋ ๊ฒ์ด๋ค
-- CSRF์ ์ ๋ ๋งค์ฒด
- ์ด๋ฉ์ผ, ๋ฉ์์ง, ์ด๋ฏธ์ง ๋งํฌ ๋ฑ ์ฌ์ฉ์๊ฐ ํน์ ๋งํฌ๋ ๋ฒํผ์ ํด๋ฆญํ๊ฒ ์ ๋ํจ
CSRF ๋ฐฉ์ด ๋ฐฉ๋ฒ
์ฌ์ฉ์์ ์์ฒญ/์ถ์ฒ๋ฅผ ๊ฒ์ฆํ์ฌ ์ ์ฑ ์์ฒญ ๋ฐฉ์ง ๋ฐ ๋ฌดํจํ
- 1. CSRF ํ ํฐ
- 2. SameSite ์ฟ ํค ์์ฑ ์ค์
- 3. Referrer Policy ์ค์
- 4. REST API์ JWT
1. CSRF ํ ํฐ
- ์๋ฒ์์ ๊ณ ์ ํ ํ ํฐ์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ ํ ํฐ
- ์๋ฒ์ ๋ค์ด์จ ์์ฒญ์ด ์ง์ง ์๋ฒ์์ ์์ฒญ๋ ๊ฒ์ด ๋ง๋์ง ํ์ธํ๋ ์ฉ๋
- ํด๋ผ์ด์ธํธ์์ POST ์์ฒญ์ hidden ๊ฐ์ ํ ํฐ์ ๋ฃ์ด ๋ณด๋ด๋ฉด ์๋ฒ์์ ํ์ธ
- ๋ณดํต์ Spring Security ์ค์ ์ ํตํด ํ์ธ
๋ค๋ง, ์ด ํ ํฐ์ post ์์ฒญ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
2. SameSite ์ฟ ํค ์์ฑ ์ค์
- ๋์ผ ์ถ์ฒ ์์ฒญ๋ง ํ์ฉํ๋ ์ค์ ์ ํตํด ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ์ ๋ฐฉ์ง
- ์๋ฒ์ธก์์ set-cookie ํค๋๋ฅผ ํตํด ์ค์ ๊ฐ๋ฅ
- ์ค์ ์ต์
- Lax์์ ๋งํ๋ ์ผ๋ถ ์ํฉ์ ์ฃผ๋ก get ์์ฒญ
- None์ผ๋ก ๋ชจ๋ ์ํฉ์ผ ํ์ฉํ ๋ Secure ์์ฑ์ ํจ๊ป ์ฌ์ฉํด์ https๋ฅผ ํตํด์๋ง ์ ์ก๋๋๋ก ํ์ฌ ์ฌ์ฉ
3. Referrer Policy
- Referrer : ์น ํ์ด์ง๋ก ์ด๋ํ ์๋ ์ถ์ฒ๋ฅผ ๋ํ๋ด๋ ํค๋
4. REST API์ JWT
- ์ทจ์ฝ์ ์ ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ ์ํ๋ฅผ ์ ์งํ์ง ์๋๋ก Statelessํ REST API ์ฌ์ฉ
- JWT๋ฅผ ํตํด ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ธ๊ฐ๋ฅผ ์งํํ์ฌ ์ธ์ ์ ์์กดํ์ง ์๋ ๋ณด์ ๊ตฌ์กฐ ํ์ฑ
XSS
XSS์ ์ ์
Cross-Site Request Scripting, ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ
- ๊ณต๊ฒฉ์๊ฐ ์น ํ์ด์ง์ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ์ฌ ์ฌ์ฉ์๊ฐ ์์ฒญํ๊ฒ๋ ์ ๋ → ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์
์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๊ฒ ํ๋ ๊ณต๊ฒฉ
(์ ์์ ์ธ ์นํ์ด์ง ์ฌ์ด์ ์ ์ฑ ์คํฌ๋ฆฝํธ ๋ผ์๋๊ณ ๊ฑธ๋ฆฌ๊ฒ๋ ์ ๋) - ํค๋ณด๋ ์ ๋ ฅ๊ฐ ํ์ทจ, ์ฟ ํค/์ธ์ ๊ฐ ํ์ทจ, ์ ์ฑ ์ฌ์ดํธ๋ก ์ ๊ทผ ์ ๋ ๋ฑ
xss ๊ณต๊ฒฉ ์ ํ
- Stored XSS (์ ์ฅํ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ)
- Reflected XSS (๋ฐ์ฌํ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ)
- DOM-based XSS (DOM ๊ธฐ๋ฐ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ)
1. Stored XSS (์ ์ฅํ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ)
- ๊ณต๊ฒฉ์๊ฐ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ฒ์ ์ ์ฅ → ์๋น์ค ํ์ด์ง์์ ์ฌ์ฉ์์๊ฒ ์คํฌ๋ฆฝํธ ๋ ธ์ถ
- ๊ณต๊ฒฉ์์ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์ ์ ์ฅ๋์ด ๋ถํน์ ๋ค์๋ฅผ ๋์์ผ๋ก ๊ณต๊ฒฉ์ ์ด์ฉ๋ ์ ์์ด ๋ฒ์๊ฐ ๊ฐ์ฅ ํผ
2. Reflected XSS (๋ฐ์ฌํ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ)
- ๊ณต๊ฒฉ์๊ฐ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋ URL์ ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ์์ผ ์ฌ์ฉ์๊ฐ ํด๋น URL์ ํด๋ฆญํ์ ๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋จ
- ์ ์ฅํ๊ณผ ๋ค๋ฅธ์ ์ ์๋ฒ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฅ๋์ง ์๊ณ , ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ์คํ๋จ
- ์ฃผ๋ก ์ฟผ๋ฆฌ์คํธ๋ง์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ๋ด์ URL์ ๋ด์ ๋ณด๋ด๊ธฐ๋ ํจ.
3. DOM-based XSS (DOM ๊ธฐ๋ฐ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ)
- ์ ์ฅํ, ๋ฐ์ฌํ๊ณผ ๋ฌ๋ฆฌ ์๋ฒ์ ์์ฒญ์์ด ๋ฐ์
- DOM ์์ญ์์ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ์๋ฒ์ ์ํธ์์ฉ์์ด ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ฒด์์ ์คํ๋์ด ์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ค์
XSS ๋ฐฉ์ด ๋ฐฉ๋ฒ
๋ฐฉ์ด ์๋ฆฌ : ์คํฌ๋ฆฝํธ ์ฝ์ ๋ฐ ์คํ ๋ฐฉ์ง ๋๋ ๋ฌดํจํ
- ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ๋ฐ ํํฐ๋ง
- ํ์ดํธ ๋ฆฌ์คํธ ๋ฐฉ์ ํํฐ๋ง
- ์ถ๋ ฅ ๊ฐ ์ธ์ฝ๋ฉ
- CSP
1. ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ๋ฐ ํํฐ๋ง
์ ๋ ฅ๊ฐ ๊ฒ์ฆ
- ์ฌ์ฉ์์ ์ ๋ ฅ๊ฐ์ด ํ์์ด๋ ๊ท์น์ ๋ง๋์ง ํ์ธ
- XSS ๋ฐฉ์ง๋ฅผ ์ํ ์ง์ ์ ์ธ ์กฐ์น๊ฐ ์๋๋ฏ๋ก ์ ๋ ฅ๊ฐ ํํฐ๋ง์ด๋ ํ์ดํธ๋ฆฌ์คํธ ๋ฐฉ์๊ณผ ํจ๊ป ์ฌ์ฉ
์ ๋ ฅ๊ฐ ํํฐ๋ง
- ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์ฝ์ ๋์ด๋ ๋์ํ์ง ์๋๋ก ์คํฌ๋ฆฝํธ์ ์ฌ์ฉ๋๋ ์ฃผ์ ํน์ ๋ฌธ์๋ฅผ HTML Entity๋ก ์นํํ์ฌ ์ ๋ ฅ
2. ํ์ดํธ ๋ฆฌ์คํธ ๋ฐฉ์ ํํฐ๋ง
- ํ์ฉ๋ ๊ฐ์ด๋ ํจํด๋ง์ ํ์ฉํ๊ณ , ๋๋จธ์ง๋ ์ฐจ๋จ
- ์) HTML ํ๋์์ ํ์ฉํ ํ๊ทธ๋ ์์ฑ์ ์ง์ ํ์ฌ <b>, <i>์ ๊ฐ์ ์์ ํ ํ๊ทธ๋ง ํ์ฉ
3. ์ถ๋ ฅ ๊ฐ ์ธ์ฝ๋ฉ
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ์ถ๋ ฅํ ๋, HTML์ด๋ JavaScript ์ฝ๋๋ก ์คํ๋์ง ์๋๋ก ์ธ์ฝ๋ฉ์ ์ ์ฉํ์ฌ ์คํฌ๋ฆฝํธ ์คํ ์ฐจ๋จ
๋ฐ๋ผ์, ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ํน์ฌ๋ ์ฝ์ ๋์๋๋ผ๋ ์ด๋ฅผ ์ถ๋ ฅํ ๋ ์คํ๋์ง ์์
4. CSP
- Content Security Policy, ์ปจํ ์ธ ๋ณด์ ์ ์ฑ
- ํ์ฉ๋ ๋ฆฌ์์ค ์ธ์๋ ์คํ๋์ง ์๋๋ก ์ค์
์ค์ ๋ฐฉ๋ฒ
1. http ์๋ต ํค๋์ Content-Security-Policy ์ค์
2. <meta> ํ๊ทธ์ http-equiv ์์ฑ ์ค์
- ๋ฆฌ์์ค๋ฅผ ํ์ฌ ๋๋ฉ์ธ์์๋ง ๋ก๋ ๊ฐ๋ฅํ๊ฒ ํ๊ฑฐ๋ ํน์ ๋๋ฉ์ธ์์๋ง ํ์ฉํ๋๋ก ์ค์

- default-src 'self' : ๊ธฐ๋ณธ ๋ฆฌ์์ค๋ฅผ ํ์ฌ ๋๋ฉ์ธ์์๋ง ๋ก๋
- 'unsafe-inline' : ๊ฐ์ ์ถ์ฒ์์ ์จ ์คํฌ๋ฆฝํธ ํ์ฉ
