๐Ÿฅง Spring Security ๋ž€?

 

 

๐Ÿž ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(Spring Security)

 

Acegi Security(์•„์‹œ์ง€ ์‹œํ๋ฆฌํ‹ฐ) ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘

โžก๏ธ ์Šคํ”„๋ง ํฌํŠธํด๋ฆฌ์˜ค ํ”„๋กœ์ ํŠธ์— ๋ณ‘ํ•ฉ๋˜๋ฉด์„œ ์ด๋ฆ„์ด Spring Security๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.

 

๐Ÿฐ Spring Security๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์ปค์Šคํ…€ ๊ฐ€๋Šฅํ•œ ์ธ์ฆ(Authentication)๊ณผ ์ ‘๊ทผ ํ†ต์ œ(Access Control) ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

๐Ÿฐ ์Šคํ”„๋ง ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ์„ ์œ„ํ•œ ํ‘œ์ค€์ด๋‹ค.

๐Ÿฐ ๋ชจ๋“  ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์ด ์“ฐ์ธ๋‹ค.

๐Ÿฐ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ, ํ•„ํ„ฐ ๊ธฐ๋ฐ˜์˜ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿฐ ํ™•์žฅ์„ฑ : ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์†์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฐ ์‹คํ–‰ํ•˜๋ ค๋ฉด Java 8 ์ด์ƒ์˜ ํ™˜๊ฒฝ์ด ํ•„์š”

 

 

 

๐Ÿž ํ•„์ˆ˜ ์šฉ์–ด ๋ฐ ๊ฐœ๋…

 

๐Ÿฅž ์ฃผ์ฒด (Principal)

๐Ÿฐ ์œ ์ €, ๊ธฐ๊ธฐ, ์‹œ์Šคํ…œ ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณดํ†ต ์œ ์ €(์‚ฌ์šฉ์ž)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

๐Ÿฅž ์ธ์ฆ (Authentication)

๐Ÿฐ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿฐ ์ฃผ์ฒด์˜ ์‹ ์›(identity)์„ ์ฆ๋ช…ํ•˜๋Š” ๊ณผ์ •

๐Ÿฐ ์ฃผ์ฒด๋Š” ์ž์‹ ์„ ์ธ์ฆํ•ด๋‹ฌ๋ผ๊ณ  ์‹ ์› ์ฆ๋ช… ์ •๋ณด(credential)์„ ์ œ์‹œํ•œ๋‹ค.

๐Ÿฐ ์ฃผ์ฒด๊ฐ€ ์œ ์ €์ผ ๊ฒฝ์šฐ ์‹ ์› ์ฆ๋ช… ์ •๋ณด๋Š” ํŒจ์Šค์›Œ๋“œ์ด๋‹ค.

 

๐Ÿฅž ์ธ๊ฐ€ (Authorization, ๊ถŒํ•œ ๋ถ€์—ฌ)

๐Ÿฐ ์ธ์ฆ์„ ๋งˆ์นœ ์œ ์ €์—๊ฒŒ ๊ถŒํ•œ(authority)์„ ๋ถ€์—ฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ๊ฐ€ํ•˜๋Š” ๊ณผ์ •

๐Ÿฐ ์ธ๊ฐ€๋Š” ๋ฐ˜๋“œ์‹œ ์ธ์ฆ ๊ณผ์ • ์ดํ›„ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋ฉฐ ๊ถŒํ•œ์€ ๋กค ํ˜•ํƒœ๋กœ ๋ถ€์—ฌํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

 

๐Ÿฅž ์ ‘๊ทผํ†ต์ œ (Access control)

๐Ÿฐ ์–ด๋–ค ์œ ์ €๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋„๋ก ํ—ˆ๋ฝํ•  ์ง€๋ฅผ ์ œ์–ดํ•˜๋Š” ํ–‰์œ„

๐Ÿฐ ์ ‘๊ทผ ํ†ต์ œ ๊ฒฐ์ •(access control decision)์ด ๋’ค๋”ฐ๋ฅธ๋‹ค.

๐Ÿฐ ๋ฆฌ์†Œ์Šค์˜ ์ ‘๊ทผ ์†์„ฑ๊ณผ ์œ ์ €์—๊ฒŒ ๋ถ€์—ฌ๋œ ๊ถŒํ•œ ๋˜๋Š” ๋‹ค๋ฅธ ์†์„ฑ๋“ค์„ ๊ฒฐ์ •ํ•œ๋‹ค.

 

 

 


 

 

๐Ÿฅง Spring Security๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ์ด์œ 

 

 

๐Ÿž Spring Security ํŠน์ง•

 

๐Ÿฐ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ธ์ฆ์„ ์š”๊ตฌํ•œ๋‹ค.

๐Ÿฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ์•”ํ˜ธ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ์–‘์‹ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

๐Ÿฐ ์‚ฌ์šฉ์ž์˜ logout์„ ํ—ˆ์šฉํ•œ๋‹ค. โžก๏ธ LogoutFilter๋กœ ์ฝ”๋“œ์˜ ๊ตฌํ˜„์—†์ด๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋กœ๊ทธ์•„์›ƒ์„ ์ง€์›ํ•œ๋‹ค. ์ปค์Šคํ…€๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿฐ CSRF(Cross-site Request Forgery) ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

๐Ÿฐ Session Fixation(์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ)์„ ๋ณดํ˜ธํ•œ๋‹ค.

๐Ÿฐ ๋ณด์•ˆ ํ—ค๋” ํ†ตํ•ฉ

  • HSTS(HTTP Strict Transport Security) ๊ฐ•ํ™”
  • X-Content-TypeOptions
  • ์บ์‹œ ์ปจํŠธ๋กค(์ •์  ๋ฆฌ์†Œ์Šค ์บ์‹ฑ)
  • X-XSS-Protection XSS ๋ณด์•ˆ : ์Šคํฌ๋ฆฝํŠธ ๊ณต๊ฒฉ ๋ณด์•ˆ
  • ํด๋ฆญ์žฌํ‚น์„ ๋ฐฉ์ง€ํ•˜๋Š” X-Frame ์˜ต์…˜ ํ†ตํ•ฉ

๐Ÿฐ Servlet API ์ œ๊ณต

 

 

โ€ป Session Fixation (์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ)

์„ธ์…˜ ๊ณ ์ •์ด๋ž€ ๊ณต๊ฒฉ์ž๊ฐ€ ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๊ฐ€๋กœ์ฑ„๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ณต๊ฒฉ์„ ๋งํ•œ๋‹ค.

๋กœ๊ทธ์ธ ์‹œ ๋ฐœ๊ธ‰๋ฐ›์€ sessionID๊ฐ€ ๋กœ๊ทธ์ธ ์ „ํ›„๋กœ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์–ด ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ํ”ผํ•ด์ž์˜ ์„ธ์…˜์„ ํ•˜์ด์ œํ‚นํ•˜์—ฌ ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์ž๋กœ ์œ„์žฅํ•˜์—ฌ ์ ‘๊ทผํ•œ๋‹ค.

๊ณต๊ฒฉ์ž๊ฐ€ ์œ ํšจํ•œ session ID๋ฅผ ์–ป์Œ โžก๏ธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต๊ฒฉ์ž์˜ session ID๋กœ ์ž์‹ ์„ ์ธ์ฆํ•˜๋„๋ก ์œ ๋„ โžก๏ธ ์‚ฌ์šฉ๋œ session ID๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฒ€์ฆ๋œ ์„ธ์…˜์„ ํ•˜์ด์žฌํ‚น

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

 

์ฐธ๊ณ ) OWASP

์ฐธ๊ณ ) Session Fixation(์„ธ์…˜ ๊ณ ์ •) ์ทจ์•ฝ์ 

 

 

โ€ป HSTS(HTTP Strict Transport Security) ๊ธฐ๋Šฅ

HTTP Strict-Transport-Security response header

HTTP ๋Œ€์‹  HTTPS๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•ด์•ผํ•œ๋‹ค๊ณ  ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ฆฌ๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด๋‹ค.

ํ†ต์‹ ์—์„œ ์ผ๋ถ€๋ถ„ HTTP๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ sessionID๋‚˜ ์ฟ ํ‚ค๋“ฑ์ด ํ•ด์ปค์—๊ฒŒ ํƒˆ์ทจ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ์ด ๋˜์ง€๋งŒ HTTPS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—” ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ์›น์‚ฌ์ดํŠธ๊ฐ€ HTTP ์š”์ฒญ์„ ๋ฐ›๊ณ  HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•˜๋Š” ๊ฒฝ์šฐ์—, ์œ ์ €๊ฐ€ http ๋˜๋Š” ๋„๋ฉ”์ธ๋งŒ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ์— ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๊ธฐ ์ด์ „์˜ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ๋ฒ„์ „์˜ ์‚ฌ์ดํŠธ์™€ ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒฝ์šฐ, ์•…์˜์ ์ธ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋Š” man-in-the-middle attack์˜ ์ž ์žฌ์  ์œ„ํ—˜์ด ์žˆ๋‹ค.

HTTP Strict Transport Security ํ—ค๋”๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ ˆ๋Œ€๋กœ HTTP๋กœ ์‚ฌ์ดํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์•ˆ๋˜๊ณ  HTTP๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ๋ชจ๋“  ์‹œ๋„๋Š” ์ž๋™์œผ๋กœ HTTPS๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๋ฆฐ๋‹ค.

 

์ฐธ๊ณ ) mdn web docs

์ฐธ๊ณ ) HSTS

 

 

โ€ป ํด๋ฆญ์žฌํ‚น

ํด๋ฆญ์žฌํ‚น์ด๋ž€ ์›น ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์ด ํด๋ฆญํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ธ์žํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์„ ํด๋ฆญํ•˜๊ฒŒ ์†์ด๋Š” ํ•ดํ‚น ๊ธฐ๋ฒ•์ด๋‹ค.

๊ณต๊ฒฉ์ž๋Š” ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ์œ ์ถœ์‹œํ‚ค๊ฑฐ๋‚˜ ์ปดํ“จํ„ฐ์—๋Œ€ํ•œ ์ œ์–ด๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

โ€ป Cache-Control

header ํ•„๋“œ

request์™€ response ๋‚ด์˜ ์บ์‹ฑ ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

 

 

์ฐธ๊ณ ) mdn web docs

 

 


 

 

๐Ÿฅง Spring Security ํ™˜๊ฒฝ ๊ตฌ์„ฑ

 

config ํŒจํ‚ค์ง€์™€ SecurityConfig.java ํŒŒ์ผ ์ƒ์„ฑ

 

  • @Configuration , @EnableWebSecurity ์ถ”๊ฐ€
  • @EnableWebSecurity : spring security ํ•„ํ„ฐ์ฒด์ธ์— ๋“ฑ๋ก๋œ๋‹ค.

 

 

๐Ÿฅž http.csrf().disable()

form ํƒœ๊ทธ๋กœ๋งŒ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๊ณ  postman ๋“ฑ์˜ ์š”์ฒญ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿฅž http.headers().frameOptions().disable()

h2 ์—ฐ๊ฒฐํ•  ๋•Œ ํ•„์š”ํ•˜๋‹ค.

 

 

๐Ÿฅž BCryptPasswordEncoder ํด๋ž˜์Šค

PasswordEncoder๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ด๊ณ  ๊ฐ•๋ ฅํ•œ ํ•ด์‹œ ํ•จ์ˆ˜์ธ BCrypt ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

โ€ป ์ฐธ๊ณ ) bcrypt

๋ธ”๋กœํ”ผ์‹œ ์•”ํ˜ธ์— ๊ธฐ๋ฐ˜์„ ๋‘” ์•”ํ˜ธํ™” ํ•ด์‹œ ํ•จ์ˆ˜

๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ๊ณต๊ฒฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด salt๋ฅผ ์ถ”๊ฐ€ํ•œ ์ ์‘ํ˜• ํ•จ์ˆ˜์˜ ํ•˜๋‚˜์ด๋‹ค.

 

 

๐Ÿฅž @EnableGlobalMethodSecurity

Spring Security ์˜ ์ „์—ญ ๋ฉ”์„œ๋“œ ๋ณด์•ˆ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

 

โœ… ์˜ต์…˜

1. securedEnabled : Secured ์• ๋„ˆํ…Œ์ด์…˜ ํ™œ์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

2. prePostEnabled : Spring Security์˜ pre/proAuthorize ์• ๋„ˆํ…Œ์ด์…˜์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

3. jsr250Enabled : @RoleAllowed ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

 

 

๐Ÿฅž @Secured

1๊ฐœ์˜ ๊ถŒํ•œ์„ ์ค„ ๋•Œ ์‚ฌ์šฉ

@Secured(“ROLE_ADMIN”)

 

 

๐Ÿฅž @PreAuthorize

 

1๊ฐœ ์ด์ƒ์˜ ๊ถŒํ•œ์„ ์ค„ ๋•Œ ์‚ฌ์šฉ

#์„ ์ด์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

@PreAuthorize(“hasRole(‘ROLE_MANAGER’) or hasRole(‘ROLE_ADMIN’)”)

 

@PreAuthozie(“isAuthenticated() and ((#user.name == principal.name) or hasRole(‘ROLE_ADMIN’))”)

 

 

 

๐Ÿฅž @PostAuthorize

 

๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์‘๋‹ตํ•˜๊ธฐ ์ง์ „์— ๊ถŒํ•œ์„ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

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

 

 


 

 

๐Ÿฅง Filter์™€ FilterChain

 

 

๐Ÿž Filter

 

Spring Filter

 

Spring Security๋Š” Servlet Filter๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ธ”๋ฆฟ์„ ์ง€์›ํ•œ๋‹ค.

Filter : HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ํ•˜๊ฒŒ๋˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € Servlet Filter๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.
  • Filter๋ฅผ ๊ฑฐ์น˜๊ณ  ๋‚˜๋ฉด Servlet(DispatcherServlet)์—์„œ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • Spring Security๋Š” ์ฃผ์š” ๋ณด์•ˆ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ Filter๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ Filter์—์„œ ํ•œ๋‹ค.
  • ์ž๋™ ์„ค์ • ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด 10๊ฐœ์˜ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์„ค์ •๋œ๋‹ค.

 

 

 

๐Ÿž FilterChain

 

Filter Chain

 

๋‹จ์ผ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ „ํ˜•์ ์ธ ๋ ˆ์ด์–ด

์—ฌ๋Ÿฌ๊ฐœ์˜ Filter๋“ค์ด ์‚ฌ์Šฌ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋˜์–ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋™์ž‘ํ•œ๋‹ค.

 

 

๐Ÿฅž FilterChain์˜ ํŠน์ง•

 

๐Ÿฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•ฑ์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ปจํ…Œ์ด๋„ˆ๋Š” ์š”์ฒญ URI์˜ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ค ํ•„ํ„ฐ์™€ ์–ด๋–ค ์„œ๋ธ”๋ฆฟ์„ ์ ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

๐Ÿฐ ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์€ ๋‹จ์ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ํ•„ํ„ฐ๋Š” ์ฒด์ธ์„ ํ˜•์„ฑํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ์‹ค์ œ๋กœ ์š”์ฒญ ์ž์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•„ํ„ฐ๊ฐ€ ๋‚˜๋จธ์ง€ ์ฒด์ธ์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฐ ํ•„ํ„ฐ๋Š” ๋‹ค์šด์ŠคํŠธ๋ฆผ ํ•„ํ„ฐ์™€ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•ด์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๐Ÿฐ ํ•„ํ„ฐ ์ฒด์ธ์˜ ์ˆœ์„œ๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ Spring Boot๋Š” ๋‘ ๊ฐ€์ง€ ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ํ•˜๋‚˜๋Š” Filter ํƒ€์ž…์˜ @Beans ์— @Order๋ฅผ ๋ถ™์ด๊ฑฐ๋‚˜ Ordered๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” API์˜ ์ผ๋ถ€๋กœ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๋Š” FilterRegistrationBean์˜ ์ผ๋ถ€๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋Š” Servlet๊ณผ ์—ฌ๋Ÿฌ Filter๋กœ ๊ตฌ์„ฑ๋œ FilterChain์„ ๋งŒ๋“ค์–ด ์š”์ฒญ URI path ๊ธฐ๋ฐ˜์œผ๋กœ HttpServletRequest๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๐Ÿฐ Filter๋Š” ์š”์ฒญ์ด DispatcherServlet์— ์˜ํ•ด ๋‹ค๋ค„์ง€๊ธฐ ์ „, ํ›„์— ๋™์ž‘ํ•œ๋‹ค.

๐Ÿฐ Filter๋Š” FilterChain์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํ•„ํ„ฐ๊ฐ€ ์—ฐ์‡„์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฐ 1๊ฐœ์˜ Servlet์ด HttpServletRequest์™€ HttpServletResponse ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

  • Filter๋Š” ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์šด ์ŠคํŠธ๋ฆผ์˜ Servlet๊ณผ Filter์˜ ์‹คํ–‰์„ ๋ง‰๋Š”๋‹ค. (๋ณดํ†ต ์ด ๊ฒฝ์šฐ Filter์—์„œ HttpServletResonse๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.)
  • ๋‹ค์šด ์ŠคํŠธ๋ฆผ์— ์žˆ๋Š” Servlet๊ณผ ์—ฌ๋Ÿฌ Filter๋กœ HttpServletRequest๋‚˜ HttpServletResponse๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

๐Ÿฐ Filter๋Š” FilterChain ์•ˆ์— ์žˆ์„ ๋•Œ ํšจ๋ ฅ์„ ๋ฐœํœ˜ํ•œ๋‹ค.

 

 

 

๐Ÿฅž Filter Interface

 

  • public void init(FilterConfig filterConfig) throws ServletException ํ•„ํ„ฐ๋ฅผ ์›น ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ์ƒ์„ฑํ•œ ํ›„ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ํ˜ธ์ถœํ•œ๋‹ค.
  • public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException ์ฒด์ธ์„ ๋”ฐ๋ผ ๋‹ค์Œ์— ์กด์žฌํ•˜๋Š” ํ•„ํ„ฐ๋กœ ์ด๋™ํ•œ๋‹ค.
  • ์ฒด์ธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์—๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ์ตœ์ข… ์ž์›์ด ์œ„์น˜ํ•œ๋‹ค.
  • public void destroy() ํ•„ํ„ฐ : ์›น ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ญ์ œ๋  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค.
  • doFilter() : ํ•„ํ„ฐ์˜ ์—ญํ• ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ

 

 

 

๐Ÿฅž FilterRegistrationBean ์˜ต์…˜

 

FilterRegistrationBean์˜ ์˜ต์…˜์œผ๋กœ Filter์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿฅ‘ addUrlPatterns

registrationBean.addUrlPatterns(“/users/*”);

setUrlPatterns์™€ ๋น„์Šทํ•˜๋‹ค.

/users/ ๋กœ ์‹œ์ž‘ํ•˜๋Š” url๋กœ ์š”์ฒญ์ด ์˜ค๊ฒŒ๋˜๋ฉด ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ๋‹ค.

 

๐Ÿฅ‘ setOrder

registrationBean.setOrder(1);

ํ•„ํ„ฐ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

 

 

๐Ÿž DelegatingFilterProxy

 

DelegatingFilterProxy

 

Spring Security๊ฐ€ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”์ฒญ์„ ๊ฐ์‹ธ๊ฒŒ ํ•ด์„œ ๋ชจ๋“  ์š”์ฒญ์— ๋ณด์•ˆ์ด ์ ์šฉ๋˜๊ฒŒ ํ•˜๋Š” ServletFilter์ด๋‹ค.

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ธ”๋ฆฟํ•„ํ„ฐ ๋ผ์ดํ”„ ์‚ฌ์ดํด๊ณผ ์—ฐ๊ณ„ํ•ด ์Šคํ”„๋ง ๋นˆ ์˜์กด์„ฑ์„ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

  • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” DelegatingFilterProxy(Filter ๊ตฌํ˜„์ฒด)๋กœ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์Šคํ”„๋ง ApplicationContext๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.
  • Servlet Container๋Š” ์ž์ฒด ํ‘œ์ค€์„ ์‚ฌ์šฉํ•ด์„œ Filter๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šคํ”„๋ง์ด ์ •์˜ํ•˜๋Š” Bean์€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • DelegatingFilterProxy๋Š” ํ‘œ์ค€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋งค์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ Filter๋ฅผ ๊ตฌํ˜„ํ•œ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์œ„์ž„ํ•œ๋‹ค.
  • DelegatingFilterProxy๋Š” ApplicationContext์—์„œ Bean Filter0๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•œ๋‹ค.
  • Bean Filter0๋Š” FilterChainProxy๊ฐ€ ๋œ๋‹ค.

 

 

 

๐Ÿž FilterChainProxy

 

Spring Security๋Š” FilterChainProxy๋กœ ์„œ๋ธ”๋ฆฟ์„ ์ง€์›ํ•œ๋‹ค.

 

FilterChain Proxy

 

  • FilterChainProxy๋Š” Spring Security๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŠน๋ณ„ํ•œ Filter๋กœ SecurityFilterChain์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ Filter ์ธ์Šคํ„ด์Šค๋กœ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • FilterChainProxy๋Š” ๋นˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต DelegatingFilterProxy๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋‹ค.
  • DelegatingFilterProxy๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์ด๋ฉฐ, Spring IOC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” Filter Bean์„ ๊ฐ–๊ณ ์žˆ๋‹ค.
  • Filter Bean์€ FilterChainProxy์ด๋ฉฐ ์ด ๊ฐ์ฒด์•ˆ์—์„œ Security์™€ ๊ด€๋ จ๋œ ์ผ๋“ค์ด ๋ฒŒ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. (์œ„ ๊ทธ๋ฆผ์—์„œ์˜ DelegatingFilterProxy์•ˆ์— Bean Filter๋Š” FilterChainProxy๊ฐ€ ๋œ๋‹ค.)

 

์ˆœ์ˆ˜ํ•œ Servlet Filter๋Š” ๋ณธ๋ž˜ Spring Container ์™ธ๋ถ€์— ์กด์žฌํ•œ๋‹ค.

DelegatingFilterProxy ํด๋ž˜์Šค๋Š” Filter๋ฅผ Spring Bean์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

DelegatingFilterProxy ํด๋ž˜์Šค(Filter Class)๋Š” Servlet Filter ์‚ฌ์ด์— ์กด์žฌํ•˜๊ณ  Spring Bean์œผ๋กœ ๋“ฑ๋ก๋œ Filter์—๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค.

 

 


 

 

๐Ÿฅง DelegatingPasswordEncoder

 

 

๐Ÿž DelegatingPasswordEncoder ๋ž€?

 

Spring Security 5.0 ๋ฒ„์ „ ์ด์ „์— PasswordEncoder์˜ ๊ธฐ๋ณธ๊ฐ’์ธ NoOpPasswordEncoder๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ ํžˆ์Šคํ† ๋ฆฌ ์„ธ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ PasswordEncoder ๊ธฐ๋ณธ๊ฐ’์ด ์ด์ œ BCryptPasswordEncoder ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค์Œ์˜ 3๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(์ด์‹)์ด ์‰ฝ์ง€ ์•Š์€ ์˜›๋‚  ๋ฐฉ์‹์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ด€ํ–‰์ด ๋‹ค์‹œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ
  • Spring Security๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ ์ž์ฃผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

๋Œ€์‹ ์— Spring Security๋Š” ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  DelegatingPasswordEncoder๋ฅผ ๋„์ž…ํ–ˆ๋‹ค.

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

 

 

์ฐธ๊ณ ) Baeldung Spring Method Security

์ฐธ๊ณ ) Spring Security doc

 

 

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ค๊ฐœ๋…์— ๋Œ€ํ•œ ์ง€์ ์€ ๋Š˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค. ๐Ÿ˜