๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[Spring]/Spring Security

๋‹น์‹ ์˜ ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(1) - SecurityConfig ๊ตฌ์„ฑํ•˜๊ธฐ

by ํŒกํŽ‘ํ 2024. 7. 8.
728x90
๐Ÿ“Œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๋ถ€ํ„ฐ SecurityConfig์˜ ์ดˆ๊ธฐ ์„ค์ •์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค— ์ €์˜ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ตฌํ˜„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
- ํ”„๋ก ํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋‚˜๋‰˜์–ด ์ง„ํ–‰๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์—์„œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์„ค์ •์„ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š์Œ
- JWT ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ
- ํ† ํฐ ๊ด€๋ฆฌ์— redis๋ฅผ ์ด์šฉํ•จ

 

๐Ÿ™‰ ์ด์ „ ๊ธ€ ๋ณด๊ธฐ

์ฒซ ๋ฒˆ์งธ ๊ธ€๋ถ€ํ„ฐ ์ •๋…ํ•˜์‹œ๋ฉด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

https://suzuworld.tistory.com/438 - ๋‹น์‹ ์˜ ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ†บ์•„๋ณด๊ธฐ

 

๐Ÿ“– ๋ชฉ์ฐจ

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ†บ์•„๋ณด๊ธฐ

SecurityConfig ๊ตฌ์„ฑํ•˜๊ธฐ (ํ˜„์žฌ ๊ธ€)

 

โš™๏ธํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

  • ์Šคํ”„๋ง๋ถ€ํŠธ 3.x, ์ž๋ฐ” 17๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์˜์กด์„ฑ์„ ์ฐธ๊ณ ํ•˜์‹œ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

 

๐Ÿš— ํ”„๋กœ์ ํŠธ ์‹คํ–‰ํ•ด ๋ณด๊ธฐ

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

 

  • ์ดํ›„ ํ”„๋กœ์ ํŠธ์—์„œ ์„ค์ •ํ•œ ํฌํŠธ๋ฒˆํ˜ธ์— /login์ด๋ผ๋Š” ์—”๋“œํฌ์ธํŠธ๋กœ ์ ‘์†ํ•˜๋ฉด ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ํผ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๊ฐ’์€ username(id)์€ user, password๋Š” ์‹คํ–‰ํ•  ๋•Œ ์ฝ˜์†”์— ๋‚˜์˜ค๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. 
    • ์ €์˜ ๊ฒฝ์šฐ์—๋Š” ์œ„์˜ ์‚ฌ์ง„์— ๋‚˜์˜จ ๊ฒƒ๊ณผ ๊ฐ™์ด Using generated security password: c151d88c-71ab-4628-8628-ebd64dd0ea36์ž…๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ๊ธฐ๋ณธ username๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, application.properties ํŒŒ์ผ์ด๋‚˜ application.yml ํŒŒ์ผ์— ์‚ฌ์šฉ์ž ์ •์˜ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ ์Šคํ”„๋ง๋ถ€ํŠธ ์—๋ŸฌํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.
    • ๋‹น์—ฐํ•˜์ฃ ? ์•„์ง ์•„๋ฌด๊ฒƒ๋„ ๋งŒ๋“ค์ง€ ์•Š์•˜์œผ๋‹ˆ๊นŒ์š”.

 

๐Ÿ› ๏ธ ์‹œํ๋ฆฌํ‹ฐ Config

  • ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์„ ํ•ด๋ด…์‹œ๋‹ค. 

@Configuration

  • ์Šคํ”„๋ง ์„ค์ • ํด๋ž˜์Šค์ž„์„ ๋‚˜ํƒ€๋‚ด์–ด ์Šคํ”„๋ง์—๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

@EnableWebSecurity

  • ์›น ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

@RequiredArgsConstructor

  • ํด๋ž˜์Šค์˜ ๋ชจ๋“  final์ด ๋ถ™์€ ํ•„๋“œ์— ๋Œ€ํ•ด ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ๊ธ€์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

extends SecurityConfigurerAdapter

  • ScurityConfigurerAdapter๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ์„ค์ •์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • ์ด ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ•„์š”ํ•œ ์„ค์ •์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

<DefaultSecurityFilterChain, HttpSecurity>

  • ์ œ๋„ค๋ฆญ ํƒ€์ž… <DefaultSecurityFilterChain, HttpSecurity>๋Š” ์„ค์ •ํ•  ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ ์ฒด์ธ๊ณผ ์„ค์ • ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • DefaultSecurityFilterChain : ๊ธฐ๋ณธ ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ ์ฒด์ธ์œผ๋กœ, ์—ฌ๋Ÿฌ ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • HttpSecurity : HTTP ๋ณด์•ˆ ์„ค์ •์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ์ฒด๋กœ ํŠน์ • URL ํŒจํ„ด์— ๋Œ€ํ•œ ๋ณด์•ˆ ์„ค์ •์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โš™๏ธ SecurityFilterChain

  • ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋‚˜์˜ค๋Š” WebSecurityConfigurerAdapter๋ฅผ ์ƒ์†ํ•˜๊ณ  configure ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๋ฐฉ์‹์€ ์Šคํ”„๋ง ๋ถ€ํŠธ 3.x ์ด์ƒ๋ถ€ํ„ฐ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ 6 ์ด์ƒ ๋ฒ„์ „์ด ์ ์šฉ๋˜๋ฉด์„œ deprecated ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ๋Š” @Bean์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์ข… ์„ค์ •์€ HttpSecurity๋ฅผ ํ†ตํ•ด ์ด๋ค„์ง‘๋‹ˆ๋‹ค. 

 

๐Ÿ‘จ๐Ÿป‍๐Ÿ”ฌ ๋‚ด๋ถ€ ์„ค์ •

  • ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด HttpSecurity๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ข… ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๊ณณ์—์„œ csrf, oauth2, ๊ฐ์ข… ํ•„ํ„ฐ, ํ•ธ๋“ค๋Ÿฌ, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œํ๋ฆฌํ‹ฐ ๊ด€๋ จ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ์˜ˆ์‹œ์—์„œ๋Š” ๊ตฌํ˜„์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋งŒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
    • oauth2๋‚˜ ๋กœ๊ทธ์ธํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜๋ฉด ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์ฐพ์•„๋ณด์‹œ๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ต์‹ฌ์€ ์ „์ฒด์ ์ธ ๋™์ž‘์›๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

  • ์ผ๋‹จ ์œ„ ์„ค์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.
  • ์œ„ ๋‚ด์šฉ์ด ์ „๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ๋‹ค ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ˆœ์„œ๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค๋ฅธ ์„ค์ •์€ ํ•ด๋‹น ๋‚ด์šฉ์ด ๋‚˜์˜ฌ ๋•Œ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

โœจ ๋žŒ๋‹ค(Lambda)

  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ 6.1 ์ดํ›„๋ถ€ํ„ฐ๋Š” ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์„ ๊ตฌ์„ฑํ•  ๋•Œ ๋žŒ๋‹ค DSL์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋žŒ๋‹ค์‹์€ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ::๋‚˜ ->์™€ ๊ฐ™์€ ์‹์˜ ํ‘œํ˜„์„ ์ฒ˜์Œ ๋ณด์‹  ๋ถ„๋“ค์€ ๋ณ„ ๊ฑฐ ์—†๊ณ  ๊ทธ๋ƒฅ ํ•จ์ˆ˜ ํ‘œํ˜„ ๋ฐฉ์‹์ด ๋žŒ๋‹ค๋ผ๋Š” ๊ฒƒ์ด๋‹ˆ ๋„˜์–ด๊ฐ€์…”๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

https://docs.spring.io/spring-security/reference/migration-7/configuration.html

 

Configuration Migrations :: Spring Security

The Lambda DSL is present in Spring Security since version 5.2, and it allows HTTP security to be configured using lambdas. You may have seen this style of configuration in the Spring Security documentation or samples. Let us take a look at how a lambda co

docs.spring.io

 

 

csrf(AbstractHttpConfigurer::disable)
  • csrf(์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ)๋Š” ์„ธ์…˜์ด๋‚˜ ์ฟ ํ‚ค ์ธ์ฆ ๋ฐฉ์‹์˜ ์ทจ์•ฝ์ ์„ ๋…ธ๋ฆฐ ๊ณต๊ฒฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์—์„œ๋Š” JWT ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ฐฉ์–ด๊ฐ€ ํ•„์š” ์—†์–ด ์„ค์ •์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์„ค๋ช…๋งŒ์œผ๋กœ ๊ธ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•  ์ •๋„๋กœ ๋ฐฉ๋Œ€ํ•œ ๋ถ„๋Ÿ‰์ด๋ฏ€๋กœ ์ž˜ ์š”์•ฝ ์ •๋ฆฌ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

https://junhyunny.github.io/information/security/spring-boot/spring-security/cross-site-reqeust-forgery/

 

CSRF(Cross-Site Request Forgery) Attack and Defence

<br /><br />

junhyunny.github.io

 

.httpBasic(AbstractHttpConfigurer::disable)
  • HTTP Basic ์ธ์ฆ์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ HTTP ํ—ค๋”์— ํฌํ•จ์‹œ์ผœ ์„œ๋ฒ„์— ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๊ฒƒ ์—ญ์‹œ JWT ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

 

.formLogin(AbstractHttpConfigurer::disable)
  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋กœ๊ทธ์ธ ํผ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์œ„์—์„œ ์ œ๊ฐ€ ๋ณด์—ฌ๋“œ๋ฆฐ ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ์ €ํฌ๋Š” ๋ฐฑ์—”๋“œ ์˜์—ญ๋งŒ ๋งŒ๋“ค ๊ฑฐ๋‹ˆ๊นŒ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

 

.authorizeHttpRequests((authorizeRequests) -> authorizeRequests
                .requestMatchers("/login").permitAll()
                .anyRequest().authenticated())
  • HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ๊ฐ€ ๊ทœ์น™์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐฑ์—”๋“œ ํŒŒํŠธ๋Š” ์—ฌ๋Ÿฌ api๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด api๋ฅผ ๋ถ™์ด์ž–์•„์š”. ์ด๋•Œ ๋ฐฑ์—”๋“œ์—์„œ ๋งŒ๋“  ์—ฌ๋Ÿฌ api ์—”๋“œํฌ์ธํŠธ์— ์–ด๋”˜๊ฐ€๋Š” ๊ถŒํ•œ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๊ณ , ์–ด๋”˜๊ฐ€๋Š” ๊ถŒํ•œ์ด ํ•„์š” ์—†์„ ํ…๋ฐ์š”.
    • ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋กœ ์ ‘๊ทผ ์š”์ฒญ์„ ํ•ด์•ผ ํ•˜๋Š” api์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ api๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์„ค์ •์„ ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
  • ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ๊ฐ€ ๊ทœ์น™์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • reuestMatcher๋Š” ์š”์ฒญ api ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.
  • ์ €์˜ ๊ฒฝ์šฐ์—๋Š” /login์ด๋ผ๋Š” ์—”๋“œํฌ์ธํŠธ๋Š” ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋กœ๊ทธ์ธํ•  ํŽ˜์ด์ง€๋ฅผ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค๋ฉด ์•„๋ฌด๋„ ๋กœ๊ทธ์ธ ํ•  ์ˆ˜ ์—†๊ฒ ์ฃ ?
  • ๋กœ๊ทธ์ธ ์™ธ ์š”์ฒญ์€ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๊ต‰์žฅํžˆ ํ์‡„์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹คใ…‹.ใ…‹

 

๐Ÿค” ํŠน์ • ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค์ •

  • ํŠน์ • ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•ด ๊ต‰์žฅํžˆ ์ž์„ธํ•œ ์ ‘๊ทผ ๊ถŒํ•œ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €๋„ ์ „๋ถ€ ์‚ฌ์šฉํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ ๋ช…์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค๋ฉด permitAll์€ ํ•ด๋‹น ๊ฒฝ๋กœ๋Š” ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. demyAll์€ ๋ˆ„๊ตฌ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋ญ ๊ทธ๋Ÿฐ ๊ฑฐ๊ฒ ์ฃ ?

 

๐Ÿ“‘ ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด ๊ฒฝ๋กœ ๋งค์นญ

.requestMatchers("/admin") // /admin ๊ฒฝ๋กœ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ์š”์ฒญ
.requestMatchers("/admin/*") // /admin/ ํ•˜์œ„์˜ ํ•œ ์ˆ˜์ค€ ๊ฒฝ๋กœ์™€ ๋งค์นญ, ์˜ˆ: /admin/user
.requestMatchers("/admin/**") // /admin/ ํ•˜์œ„์˜ ๋ชจ๋“  ๊ฒฝ๋กœ์™€ ๋งค์นญ, ์˜ˆ: /admin/user/edit
.requestMatchers("/*.html") // ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  .html ํŒŒ์ผ ์š”์ฒญ๊ณผ ๋งค์นญ
.requestMatchers("/admin/{regex:[a-z]+}") // ์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ ๋งค์นญ
.requestMatchers(HttpMethod.GET, "/admin/**") // GET ์š”์ฒญ์— ๋Œ€ํ•ด /admin/ ํ•˜์œ„์˜ ๋ชจ๋“  ๊ฒฝ๋กœ์™€ ๋งค์นญ
  • ์œ„์™€ ๊ฐ™์ด ์ ‘๊ทผ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ํŒจํ„ด ๋งค์นญ์„ ํ†ตํ•ด ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ˜„ ์˜ˆ์‹œ

.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasRole("USER")
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
  • ์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

.requestMatchers("/admin/**").hasRole("ADMIN")

  • /admin์ด ํฌํ•จ๋œ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋Š” ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž ์ค‘ ADMIN์ด๋ผ๋Š” Role์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋งŒ์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

.requestMatchers("/user/**").hasRole("USER")

  • /user๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋Š” ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž ์ค‘ USER๋ผ๋Š” Role์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋งŒ์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

.requestMatchers("/", "/home").permitAll()

  • "/"๋‚˜ "/home"์€ ๋ชจ๋‘ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์—”๋“œํฌ์ธํŠธ๋ผ๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

.anyRequest().authenticated()

  • ์ด์™ธ์˜ ๋ชจ๋“  ์š”์ฒญ์€ ํŠน๋ณ„ํ•œ Role ์—†์ด ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋‘ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

 

.sessionManagement(sessionManagement -> sessionManagement
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS))
  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ถ€๋ถ„ ์—ญ์‹œ JWT ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜์„ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

return http.build();
  • ์œ„์—์„œ ์„ค์ •ํ•œ ๊ตฌ์„ฑ์„ ๋นŒ๋“œํ•˜๊ณ  ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿƒ๐Ÿป ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ

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

 

 

 

์ฐธ๊ณ 

๋คผํŠผ

https://velog.io/@sehwan24/Lamda-DSL์„-์ด์šฉํ•œ-HttpSecurity-WebSecurity-๊ตฌ์„ฑ

 

728x90