๐ŸŒฟSpring

[Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #2 ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํ† ํฐ ํƒˆ์ทจ + ๋Œ€์‘ ์ „๋žต

์†Œ์˜ ๐Ÿ€ 2025. 5. 23. 18:01

1ํŽธ: https://syleeblog.tistory.com/51

 

[Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #1: CSRF๊ณต๊ฒฉ๊ณผ XSS ๊ณต๊ฒฉ + ๋Œ€์‘ ์ „๋žต

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€ ์ฃผ์š” ๋ณด์•ˆ ๊ณต๊ฒฉ: CSRF ๊ณต๊ฒฉ, XSS ๊ณต๊ฒฉ, ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํƒˆ์ทจ ๊ณต๊ฒฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ,์ด๋ฅผ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š” Spring Security ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋Œ€์‘ ์ „๋žต์„ ์‚ดํŽด

syleeblog.tistory.com

 

 

 ๐Ÿ“Œ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ

์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์„ธ์„  ID๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•ด๋†“๊ณ , ํ”ผํ•ด์ž๊ฐ€ ๊ทธ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“  ๋’ค,

ํ”ผํ•ด์ž๊ฐ€ ๊ฐ™์€ ์„ธ์…˜์œผ๋กœ ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ ํ”ผํ•ด์ž์˜ ๊ถŒํ•œ์„ ํƒˆ์ทจํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

 

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

 


  • ๊ณต๊ฒฉ์ž๊ฐ€ ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ์„ธ์…˜ID(ABC123)๋ฅผ ๋ถ€์—ฌ๋ฐ›์Šต๋‹ˆ๋‹ค.
    • ์›น ์„œ๋ฒ„๋Š” ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„ ์—†์ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜ID๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์„ธ์…˜ ID๊ฐ€ ์žˆ๋Š” ๋กœ๊ทธ์ธ ๋งํฌ๋ฅผ ํ”ผ์‹ฑ ์ด๋ฉ”์ผ ๋“ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด๊ณ ,
    • ํ”ผํ•ด์ž์—๊ฒŒ http://example.com/login;jsessionid='ABC123' ๋งํฌ๋ฅผ ๋ณด๋‚ด๊ณ , ํ”ผํ•ด์ž๊ฐ€ ๋ชจ๋ฅด๊ณ  ์ด ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ฒฝ์šฐ๋Š” ์ฟ ํ‚ค ๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋ผ URL์— ์„ธ์…˜ ID๋ฅผ ๋ถ™์ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋งํฌ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, ์ด ์„ธ์…˜ID(ABC123๋Š” ๋กœ๊ทธ์ธ๋œ(์ธ์ฆ๋œ) ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณต๊ฒฉ์ž๋Š” ๊ฐ™์€ ์„ธ์…˜ ID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ”ผํ•ด์ž์˜ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋กœ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’‰ ๋Œ€์‘ ์ „๋žต

๊ณต๊ฒฉ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์„ธ์…˜ ID๊ฐ€ ๋กœ๊ทธ์ธ ์ดํ›„์—๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋  ๋•Œ,

์ฆ‰ ์„ธ์…˜์ด ๊ณ ์ •๋  ๋•Œ ์ด ๊ณต๊ฒฉ์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋กœ๊ทธ์ธ ๋•Œ๋งˆ๋‹ค ์„ธ์…˜์„ ๋ฐ”๊พธ๋Š” ์‹์œผ๋กœ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring Security์˜ SecurityFilterChain์—์„œ sessionManager์— ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ ๋ฐฉ์–ด ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http.sessionManagement(s -> s
     .sessionFixation(sf -> sf.changeSessionId()));  // ์„ธ์…˜ ID๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๋ชจ๋“œ ์„ ํƒ

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ต์…˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • none: ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ , ์„ธ์…˜ ID๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜์ด ๋ณดํ˜ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • newSession: ๋กœ๊ทธ์ธ ์‹œ ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • migrateSession: ๋กœ๊ทธ์ธ ์‹œ ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ , ์„ธ์…˜ ID๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด์ „ ์„ธ์…˜์˜ ์†์„ฑ๋“ค(๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„ ๋“ฑ)์„ ์ƒˆ๋กœ์šด ์„ธ์…˜์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ๊ธฐ๋ณธ๊ฐ’
  • changeSession: ์„ธ์…˜ ์ž์ฒด๋Š” ์œ ์ง€ํ•˜๊ณ  ์„ธ์…˜ ID๋งŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ŒJWT ํ† ํฐ ํƒˆ์ทจ

JWT ํ† ํฐ์„ ์ด์šฉํ•œ ์ธ์ฆ ๋ฐฉ์‹์„ ์“ฐ๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ์ดํŠธ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด ์œ ํšจํ•œ JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

์ด๋•Œ ๊ณต๊ฒฉ์ž๊ฐ€ XSS ๊ณต๊ฒฉ ๋“ฑ ์–ด๋–ค ๋ฐฉ๋ฒ™์œผ๋กœ JWT ํ† ํฐ๊ฐ’์„ ์•Œ์•„๋‚ด๊ณ 

๊ณต๊ฒฉ์ž๊ฐ€ ์ด ํ† ํฐ์„ ์ž์‹ ์ด ๋ณด๋‚ด๋Š” ์š”์ฒญ์˜ Authorization ํ—ค๋”์— ๋„ฃ์–ด์„œ ์„œ๋ฒ„์— ๋ณด๋‚ด๋ฉด

์„œ๋ฒ„์—์„œ๋Š” ์œ ํšจํ•œ ํ† ํฐ์ด๋ฏ€๋กœ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’‰ ๋Œ€์‘ ์ „๋žต

ํ† ํฐ ์ž์ฒด๋ฅผ ํƒˆ์ทจ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ HTTPS ์‚ฌ์šฉ, XSS ๊ณต๊ฒฉ ๋ฐฉ์–ด ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด JWT ํ† ํฐ์„ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๊ณ , CSRF ๊ณต๊ฒฉ์„ ๋ง‰๋„๋ก ์‹ ๊ฒฝ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ํƒˆ์ทจ๋ฅผ ์™„์ „ํžˆ ๋ง‰๊ธฐ ์–ด๋ ค์šฐ๋ฏ€๋กœ, ํƒˆ์ทจ๋œ ํ† ํฐ์ด ์˜ค๋ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ ํšจํ•œ ํ† ํฐ์ด ํƒˆ์ทจ๋œ ๋™์•ˆ์—๋Š” ๊ณต๊ฒฉ์ž์˜ ํ–‰๋™์„ ๋ง‰๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฒฉ์ž๊ฐ€ ํƒˆ์ทจํ•œ ํ† ํฐ์ด ๊ธˆ๋ฐฉ ์“ธ๋ชจ ์—†์–ด์ง€๋„๋ก์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Access Token๊ณผ Refresh Token์„ ๊ฐ™์ด ์“ฐ๋Š” 2๋‹จ ๊ตฌ์กฐ๋Š”

  • Access Token์˜ ์ˆ˜๋ช…์€ ์งง๊ฒŒ ์„ค์ •ํ•˜๊ณ (ex 5-30๋ถ„)
  • Refresh Token์˜ ์ˆ˜๋ช…์„ ๊ธธ๊ฒŒ ์„ค์ •ํ•˜์—ฌ(ex 1-30์ผ)

Access Token์ด ๊ธˆ๋ฐฉ ๋งŒ๋ฃŒ๋˜์–ด๋„ Refresh Token์„ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด AccessToken์„ ๋‹ค์‹œ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

ํƒˆ์ทจ๋œ Access Token์€ ๊ณง ๋งŒ๋ฃŒ๋˜์–ด ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ณ , Refresh Token์€ ์„œ๋ฒ„์—์„œ๋งŒ ์ €์žฅํ•˜๊ฑฐ๋‚˜, ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธ๋˜๋ฏ€๋กœ ์žฌ๋ฐœ๊ธ‰๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

 

Refresh Token ์ž์ฒด๋„ ํƒˆ์ทจ๋  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  Access Token์ด ๋งŒ๋ฃŒ๋  ๋•Œ๋งŒ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ์ถœ ๊ธฐํšŒ๊ฐ€ ์ ์–ด Access Token ๋ณด๋‹ค๋Š” ํƒˆ์ทจ๋  ํ™•๋ฅ ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

 


์ฐธ๊ณ ์ž๋ฃŒ

https://velog.io/@ckdwns9121/%ED%86%A0%ED%81%B0token%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%83%88%EC%B7%A8-%EB%8B%B9%ED%95%98%EB%8A%94%EA%B0%80

๋ฐ˜์‘ํ˜•