๐Ÿ”ฌ Computer Science/Security

CSRF(Cross-Site Request Forgery)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž (feat. XSS์™€์˜ ์ฐจ์ด)

dev-ong 2024. 8. 20. 16:39

Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜์ค‘์— Security ๊ด€๋ จ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ csrf ์„ค์ •์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด๊ณ , csrf๊ฐ€ ๊ถ๊ธˆํ•ด์ ธ์„œ ์•Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„์Šทํ•œ ๊ฐœ๋…์ธ XSS์— ๋Œ€ํ•ด์„œ๋„ ์‚ด์ง ๋ง›๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


1. CSRF(Cross-Site Request Forgery: ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ)

CSRF๋Š” Cross-Site Request Forgery์˜ ์•ฝ์ž๋กœ, ๋ฒˆ์—ญํ•˜๋ฉด ์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

CSRF๋Š” ์›น์‚ฌ์ดํŠธ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์˜์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„(๋ฐ์ดํ„ฐ ์‚ญ์ œ, ์ˆ˜์ •, ๋“ฑ๋ก ๋“ฑ)์„ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์š”์ฒญ์ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๋™์˜๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ CSRF ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆํ•œ ์„ธ์…˜์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์ธ ์š”์ฒญ๊ณผ ๋น„์ •์ƒ์ ์ธ ์š”์ฒญ์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ ์„ ์•…์šฉํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์‹

๊ณต๊ฒฉ์ž์˜ ์š”์ฒญ์ด ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์†์—ฌ์„œ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ์— 'ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ'๋ผ๋Š” ๋ช…์นญ์ด ๋ถ™์—ˆ์Šต๋‹ˆ๋‹ค.

 

CSRF ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค

CSRF ๊ณต๊ฒฉ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์ ‘์†ํ•ด์„œ ๋กœ๊ทธ์ธํ•˜์—ฌ ๊ถŒํ•œ์„ ์ธ์ฆํ•˜๊ณ  ์„ธ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๊ณต๊ฒฉ์ž๋Š” ์•…์„ฑ ์›น์‚ฌ์ดํŠธ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์œ ์ธํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ณต๊ฒฉ์ž์˜ ์•…์„ฑ ์›น์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์‚ฌ์šฉ์ž๊ฐ€ ์•…์„ฑ ์›น์‚ฌ์ดํŠธ์— ๋ฐฉ๋ฌธํ•˜๋ฉด, ํ•ด๋‹น ํŽ˜์ด์ง€์— ํฌํ•จ๋œ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์ด๋ฏธ์ง€ ํƒœ๊ทธ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์€ํ–‰ ์‚ฌ์ดํŠธ๋ผ๊ณ  ํ•  ๋•Œ, ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋กœ ๋ˆ์„ ์†ก๊ธˆํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.
< img  src = "http://bank.com/transfer?amount=9999&toAccount=000011112222" />

ํ•ด๋‹น ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ์•…์„ฑ ์›น์‚ฌ์ดํŠธ์— ์‹ฌ์–ด๋‘๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†์‹œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์€ํ–‰ ์›น์‚ฌ์ดํŠธ๋กœ ๋ˆ ์†ก๊ธˆ ์š”์ฒญ์ด ๋ณด๋‚ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์‚ฌ์šฉ์ž๋Š” ์›น์‚ฌ์ดํŠธ์— ์ด๋ฏธ ์ธ์ฆ์„ ํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ, ํ•ด๋‹น ์š”์ฒญ์€ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž์˜ ์ •์ƒ์ ์ธ ์š”์ฒญ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ์ธ์ฆ๋œ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ์„œ๋ฒ„๋Š” ์ด ์•…์˜์ ์ธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€, ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ๋กœ ๋ณด๋ฉด, ์‚ฌ์šฉ์ž๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์ธ, '000011112222' ๊ณ„์ขŒ๋กœ 9,999์›์„ ์†ก๊ธˆํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

CSRF ๊ณต๊ฒฉ ์‚ฌ๋ก€

CSRF๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์š”์ฒญ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌํ•œ ์š”์ฒญ์œผ๋กœ๋Š” ์ œํ’ˆ์„ ๊ตฌ์ž…ํ•˜๊ฑฐ๋‚˜ ๊ณ„์ • ์„ค์ •, ๊ธฐ๋ก์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์‹ค์ œ๋กœ 2008๋…„์— ์˜ฅ์…˜์ด ์ค‘๊ตญ์ธ ํ•ด์ปค์—๊ฒŒ CSRF ๊ณต๊ฒฉ ๋ฐฉ์‹์œผ๋กœ ํšŒ์›์ •๋ณด๊ฐ€ ์œ ์ถœ๋œ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด์ปค๋Š” ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ํšŒ์‚ฌ ๋‚ด ์ž‘์—…์„ ํ•˜๋˜ ์˜ฅ์…˜ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋ƒˆ๊ณ , ๊ด€๋ฆฌ์ž๋Š” ์ด ๋ฉ”์ผ์„ ์กฐํšŒํ–ˆ์Šต๋‹ˆ๋‹ค. 

ํ•ด์ปค๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์ผ์—๋Š” ํƒœ๊ทธ๊ฐ€ ๋“ค์–ด๊ฐ„ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

< img  src = "http://auction.com/changeUserAccount?id=admin&password=admin"  ๋„ˆ๋น„ = "0"  ๋†’์ด = "0" >

(์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ 0์ด๋ฏ€๋กœ ๊ด€๋ฆฌ์ž๋Š” ์ด ์กด์žฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.)

๊ด€๋ฆฌ์ž๊ฐ€ ๋ฉ”์ผ์„ ์กฐํšŒํ•˜๋Š” ์ˆœ๊ฐ„ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด URL์ด ์—ด๋ฆฌ๊ฒŒ ๋˜๊ณ , ํ•ด์ปค๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ๊ด€๋ฆฌ์ž์˜ ๊ณ„์ •์ด ํ•ด์ปค๊ฐ€ ์„ค์ •ํ•œ "admin"์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ํ•ด์ปค๋Š” ์ด ๊ณ„์ •์œผ๋กœ ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์ ‘์†ํ•ด์„œ *๋ฐฑ๋„์–ด ํ”„๋กœ๊ทธ๋žจ์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

*๋ฐฑ๋„์–ด ํ”„๋กœ๊ทธ๋žจ: ์ •์ƒ์ ์ธ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ

๋ฐฑ๋„์–ด ํ”„๋กœ๊ทธ๋žจ์„ ์ด์šฉํ•ด์„œ ์˜ฅ์…˜ ๋‚ด๋ถ€ ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•ดํ‚นํ–ˆ๊ณ , ํšŒ์› ์ •๋ณด๋ฅผ ๋นผ๋‚ด๊ฐ„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋•Œ ์œ ์ถœ๋œ ํšŒ์› ์ •๋ณด๊ฐ€ 1860๋งŒ๋ช…์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ CSRF ๊ณต๊ฒฉ์— ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด ๋ง‰๋Œ€ํ•œ ํ”ผํ•ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด CSRF ํ† ํฐ์„ ํ†ตํ•ด ํ•ด๋‹น ์š”์ฒญ์ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์ „์†กํ•œ ๊ฒƒ์ด ๋งž๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์žฌ์ธ์ฆ์„ ์š”๊ตฌํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ์‹์œผ๋กœ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


2. CSRF ๊ณต๊ฒฉ ๋ฐฉ์ง€ - Synchronizer Token Pattern

Spring์—์„œ๋Š” CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ค‘ Synchronizer Token Pattern์„ ๊ฐ€์žฅ ์šฐ์„ธํ•˜๊ณ  ํฌ๊ด„์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Synchronizer Token Pattern์€ CSRF ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ๊ณ ์œ ํ•œ ๋ณด์•ˆ ํ† ํฐ์ธ CSRF ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

๐Ÿ” CSRF ํ† ํฐ

์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ํ•˜๋”๋ผ๋„ CSRF ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต JWT๋งŒ์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•œ๋‹คํ•˜์˜€์„๋•Œ์—๋„ ๊ณต๊ฒฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ CSRF ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์„œ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

CSRF ํ† ํฐ์ด๋ž€, ์„œ๋ฒ„์— ๋“ค์–ด์˜จ ์š”์ฒญ์ด ์‹ค์ œ ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•œ ์š”์ฒญ์ด ๋งž๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ์ž…๋‹ˆ๋‹ค.

CSRF ํ† ํฐ์€ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ๊ณต์œ ๋˜๋Š” ์ธ์ฆ ๊ฐ’์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์‹œ์— ์„œ๋ฒ„์—์„œ ์ธ์ฆํ•ด์ค€ CSRF ํ† ํฐ์„ ํฌํ•จํ•ด์„œ ์š”์ฒญํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. CSRF ํ† ํฐ์ด ์—†์œผ๋ฉด ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

CSRF ํ† ํฐ์„ HTML ํผ์— ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

1๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— HTTP GET ์š”์ฒญ์„ ํ†ตํ•ด ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์„œ๋ฒ„๋Š” CSRF ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  HTTP ์„ธ์…˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ CSRF ํ† ํฐ์€ HTML ํ˜•์‹์˜ ์ˆจ๊ฒจ์ง„ ํƒœ๊ทธ(hidden)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๋Š” HTML ํผ์˜ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. CSRF ํ† ํฐ์€ HTML ํผ์˜ Hidden ํ•„๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ CSRF ํ† ํฐ ๊ฐ’์ด ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ๊ป˜ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. 

4๏ธโƒฃ ์„œ๋ฒ„๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ง€์ •๋œ CSRF ํ† ํฐ ๊ฐ’๊ณผ HTTP POST ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ•  ๋•Œ HTTP ์„ธ์…˜์— ์œ ์ง€๋œ CSRF ํ† ํฐ ๊ฐ’์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž˜๋ชป๋œ ์š”์ฒญ์œผ๋กœ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์— ์ ‘์†์‹œ ์„œ๋ฒ„์—์„œ๋Š” CSRF ํ† ํฐ์„ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉ์ž ์„ธ์…˜์ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— ์• ํ”Œ๋ง„์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์š”์ฒญํ•  ๋•Œ ํŽ˜์ด์ง€์— Hidden ์œผ๋กœ ์ˆจ์–ด์žˆ๋Š” CSRF ํ† ํฐ ๊ฐ’์ด ์„œ๋ฒ„๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. 
  • ์„œ๋ฒ„์—์„œ๋Š” ์ด CSRF ๊ฐ’์ด ์„ธ์…˜์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น ์š”์ฒญ์ด ์ •์ƒ์ ์ธ ์š”์ฒญ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

CSRF ํ† ํฐ ์œ ์˜์‚ฌํ•ญ

[CSRF ํ† ํฐ์˜ ์œ„์น˜]

  • HTML ํผ ์ œ์ถœ์‹œ hidden ํ•„๋“œ๋กœ ํฌํ•จ์‹œ์ผœ์„œ ์ „์†กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • AJAX ์š”์ฒญ์„ ๋ณด๋‚ผ์‹œ์—๋Š” CSRF ํ† ํฐ์„ Custom Header ๊ฐ’์œผ๋กœ ํฌํ•จ์‹œํ‚ค๊ฑฐ๋‚˜ JSON payload(๋ฐ์ดํ„ฐ)๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CSRF ํ† ํฐ์„ ์ฟ ํ‚ค์— ํฌํ•จ์‹œ์ผœ์„œ ์ „์†กํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
    • CSRF ํ† ํฐ์€ ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ •์ƒ์ ์ธ ์ž‘์—…์ธ์ง€๋ฅผ ๊ฒ€์ฆํ•ด์•ผํ•˜๋Š”๋ฐ, ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ์ž๋™์œผ๋กœ HTTP ์š”์ฒญ์— ํฌํ•จ๋˜๋ฏ€๋กœ, ์ •์ƒ์ ์ธ ์š”์ฒญ์ธ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • '์ž๋™ ์ „์†ก'์ด๋ผ๋Š” ๊ธฐ๋Šฅ๋•Œ๋ฌธ์— ๊ณต๊ฒฉ์ž๊ฐ€ ๋งŒ๋“  ์š”์ฒญ์ด์—ฌ๋„ ์ฟ ํ‚ค๊ฐ€ ์ž๋™์œผ๋กœ ํฌํ•จ๋˜์–ด ์„œ๋ฒ„์— ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ์ธํ•ด ์„œ๋ฒ„๋Š” ์ด ์š”์ฒญ์ด ์ •์ƒ์ ์ธ ์š”์ฒญ์ด๋ผ๊ณ  ์ฐฉ๊ฐํ•˜์—ฌ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ CSRF ํ† ํฐ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „์†ก๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CSRF ํ† ํฐ์€ ์„œ๋ฒ„ ๋กœ๊ทธ๋‚˜ URL์— ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

[HTTP ์š”์ฒญ์— ๋”ฐ๋ฅธ ์š”๊ตฌ์‚ฌํ•ญ]

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋งŒ CSRF๋ฅผ ์š”์ฒญํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. (POST, PUT, PATCH, DELETE)
    • ๋‹จ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”(=๋ฉฑ๋“ฑ ์š”์ฒญ)์š”์ฒญ(GET, HEAD, OPTIONS, ๋ฐ TRACE)์ด ์˜ค์ง ์ฝ๊ธฐ ์ „์šฉ(read-only) ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ณด์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • HTTP GET(์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์š”์ฒญ)์—๋Š” CSRF ํ† ํฐ์„ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
    • GET ์š”์ฒญ์€ ์บ์‹œ๋˜๊ฑฐ๋‚˜ URL๋กœ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— CSRF ํ† ํฐ์ด ์œ ์ถœ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ† ํฐ์ด ์œ ์ถœ๋˜๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์ด ํ† ํฐ์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ CSRF ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

3. CSRF vs XSS

CSRF์™€ XSS๋Š” ๋ชจ๋‘ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ ๊ณต๊ฒฉ ์œ ํ˜•์ด์ง€๋งŒ, ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € XSS๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

 

XSS(Cross-Site Scripting)

XSS๋Š” Cross-Site Scripting์˜ ์•ฝ์ž๋กœ, ๋ฒˆ์—ญํ•˜๋ฉด ์‚ฌ์ดํŠธ ๊ฐ„ ์Šคํฌ๋ฆฝํŒ… ์ž…๋‹ˆ๋‹ค.

XSS ๊ณต๊ฒฉ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. 

์ด๋กœ์ธํ•ด ์‚ฌ์šฉ์ž๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, ๊ณต๊ฒฉ์ž์—๊ฒŒ ์ฟ ํ‚ค, ์„ธ์…˜ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจ ๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

XSS๋Š” SQL Injection๊ณผ ํ•จ๊ป˜ ์›น ์ƒ์—์„œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ์ทจ์•ฝ์  ๊ณต๊ฒฉ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

XSS ๊ณต๊ฒฉ ๋Œ€์‘ ๋ฐฉ์•ˆ

  • ์ค‘์š” ์ •๋ณด๋Š” ์ฟ ํ‚ค ๋Œ€์‹  ์„œ๋ฒ„์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™” ํ•ฉ๋‹ˆ๋‹ค.
  • httpOnly ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • document.cookie๋ฅผ ์ด์šฉํ•ด ์ฟ ํ‚ค์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
  • URL Encoding์ด๋‚˜ ๋ฌธ์ž์—ด์„ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CSRF ์™€ XSS ์˜ ์ฐจ์ด

[๊ณต๊ฒฉ ๋Œ€์ƒ]

  • CSRF ๊ณต๊ฒฉ ๋Œ€์ƒ์€ "Server"์ด๊ณ  XSS ๊ณต๊ฒฉ ๋Œ€์ƒ์€ "Client"์ž…๋‹ˆ๋‹ค.
  • CSRF๋Š” ํŠน์ • ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋…ธ๋ฆฐ ๊ฒƒ์ด๊ณ , XSS๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์›น ์‚ฌ์ดํŠธ๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ์ ์„ ๋…ธ๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[๊ณต๊ฒฉ ๋ฐฉ์‹]

  • CSRF๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์†์—ฌ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ํŠน์ • ์›น์‚ฌ์ดํŠธ๋กœ ๋ณด๋‚ด๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ์ด์šฉํ•ด ์„œ๋ฒ„์— ๋Œ€ํ•œ ์•…์„ฑ ๊ณต๊ฒฉ์„์„ ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
  • XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์›นํŽ˜์ด์ง€์— ์‚ฝ์ž…ํ•˜์—ฌ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSRF ๊ณต๊ฒฉ

1๏ธโƒฃ ๊ณต๊ฒฉ์ž์ž ์›น ์‚ฌ์ดํŠธ์— ์ž๊ธˆ ์ด์ฒด ์š”์ฒญ์„ ์œ„์กฐํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๊ณต๊ฒฉ์ž๋Š” ๊ทธ ์š”์ฒญ์„ ํ•˜์ดํผ๋งํฌ(์Šคํฌ๋ฆฝํŠธ)์— ์‚ฝ์ž…ํ•˜์—ฌ ์›น ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ ํ•  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ์‚ฌ์šฉ์ž๋„ ๋ชจ๋ฅด๊ฒŒ ์›น ์‚ฌ์ดํŠธ์— ์š”์ฒญ์„ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์›น ์‚ฌ์ดํŠธ์˜ ์„œ๋ฒ„๋Š” ๋กœ๊ทธ์ธ ๋œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •์—์„œ ๊ณต๊ฒฉ์ž์˜ ๊ณ„์ •์œผ๋กœ ์ž๊ธˆ์„ ์ด์ฒดํ•ฉ๋‹ˆ๋‹ค.

XSS ๊ณต๊ฒฉ

1๏ธโƒฃ ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•œ ์ทจ์•ฝ์ ์ด ์žˆ๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ทจ์•ฝ์ ์„ ์ฐพ์•„ ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจํ•˜๋Š” ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์ดํŠธ์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์ž‘๋™๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจํ•ฉ๋‹ˆ๋‹ค.


Reference

 

 

Cross Site Request Forgery (CSRF) :: Spring Security

When should you use CSRF protection? Our recommendation is to use CSRF protection for any request that could be processed by a browser by normal users. If you are creating a service that is used only by non-browser clients, you likely want to disable CSRF

docs.spring.io

 

์›น ๋ณด์•ˆ์˜ ๊ธฐ๋ณธ: CSRF์™€ XSS ๊ณต๊ฒฉ ์ดํ•ดํ•˜๊ธฐ

CSRF์™€ XSS ๊ณต๊ฒฉ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.

f-lab.kr

 
[๋ณด์•ˆ] CSRF

์—ฌ๊ธฐ์„œ๋Š” CSRF ๊ณต๊ฒฉ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ , ์ด๊ฒƒ์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” CSRF Token์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒจ๋กœ๊ทธ.์•„์ด์˜ค
 

XSS์™€ CSRF ์ฐจ์ด์  ๋ฐ ๋Œ€์‘ ๋ฐฉ์•ˆ

์›น์‚ฌ์ดํŠธ์—์„œ ์˜๋„์น˜ ์•Š์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ฃ์–ด์„œ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค.์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›์€ ๊ฐ’์„ ์ œ๋Œ€๋กœ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์˜

velog.io