Spring Security

๋ณธ ๊ธ€์€ Spring Security 5.7 ์ด์ „ ๋ฒ„์ „์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Spring Security

์ •์˜

  • Spring ๊ธฐ๋ฐ˜ ์•ฑ์˜ ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์œ„ํ•œ Spring์˜ ํ•˜์œ„ ํ”„๋ ˆ์ž„์›Œํฌ

  • Filter ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

Security๊ฐ€ ๊ด€์—ฌํ•˜๋Š” ์˜์—ญ

ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„์˜ ์ธ์ฆ ๊ธฐ๋ฐ˜ ํ†ต์‹  ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์š”์ฒญ ์‹œ, ์ •๋ณด๊ฐ€ ๋งž๋‹ค๋ฉด ์„ธ์…˜, ํ† ํฐ ๋“ฑ์˜ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ƒ์„ฑ๋œ ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋จ

  2. ์ด ์ •๋ณด๋Š” ์ฟ ํ‚ค, ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ์˜ ๋ธŒ๋ผ์šฐ์ € ์ €์žฅ์†Œ์— ์ €์žฅ๋จ

  3. ์‚ฌ์šฉ์ž๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ ์ด ์ •๋ณด๋ฅผ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†ก

  4. ์„œ๋ฒ„๋Š” ์ด ์ •๋ณด๋ฅผ ํ•ด์„ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ , ํ—ˆ์šฉ๋œ ๋ฆฌ์†Œ์Šค๋ผ๋ฉด ์ด๋ฅผ ์ œ๊ณต

Spring Security๊ฐ€ ๊ด€์—ฌํ•˜๋Š” ๊ฒƒ์€ 1๋ฒˆ๊ณผ 4๋ฒˆ์œผ๋กœ, 1๋ฒˆ์€ ์ธ์ฆ ๊ณผ์ •, 4๋ฒˆ์€ ์ธ๊ฐ€ ๊ณผ์ •์— ํ•ด๋‹นํ•œ๋‹ค.

์ธ์ฆ (Authentication)

  • ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ์ž์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ

  • Spring Security์—์„œ๋Š” ์ธ์ฆ์„ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • Principle - ์ธ์ฆ์„ ์š”์ฒญํ•œ ์‚ฌ์šฉ์ž (๋˜๋Š” ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””). Uniqueํ•ด์•ผ ํ•จ

    • Credential - ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ

์ธ๊ฐ€ (Authorization)

  • ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋ฉด, ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๊ฐ€์กŒ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ

  • Spring Security์—์„œ๋Š” Role๊ณผ Authority๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌ๋œ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

    • Role - ์–ด๋–ค ์—ญํ• ์„ ๊ฐ€์กŒ๋Š”๊ฐ€? (๊ด€๋ฆฌ์ž, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๋“ฑ)

    • Authority - ์–ด๋–ค ๊ถŒํ•œ์„ ๊ฐ€์กŒ๋Š”๊ฐ€? (์ฝ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ)

Spring Security Architecture

Security Filter๋“ค์€ Bean์ด๋ฉด์„œ Filter

Filter๋Š” Filter Chain์ด๋ผ๋Š” ๊ตฌ์กฐ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ์šฉ๋˜๋ฉฐ, Spring Security์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋Š” Filter ๋˜ํ•œ Filter Chain์˜ ์ผ๋ถ€๋กœ ์กด์žฌํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Security ๊ด€๋ จ Filter๋“ค์€ ๋ชจ๋‘ Bean์ธ๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ Filter๋Š” Dispatcher Servlet์— ์ „๋‹ฌ๋˜๊ธฐ ์ด์ „์— ์ ์šฉ๋˜๋Š” Servlet์— ํ•ด๋‹นํ•œ๋‹ค.

Security์˜ Filter๋“ค์€ Bean์œผ๋กœ ์ ์šฉ๋˜๊ธฐ ์œ„ํ•ด DelegatingFilterProxy๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ์‹ค์ œ ํ•„ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” DelegatingFilterProxy๊ฐ€ Bean์ธ FilterChainProxy๋ฅผ ํ˜ธ์ถœํ•ด ์‹œํ๋ฆฌํ‹ฐ ๊ด€๋ จ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Filter Chain

SecurityFilterChain

ํ•˜๋‚˜์˜ SecurityFilterChain์€ ํ•œ ์ข…๋ฅ˜์˜ ํŠน์ • path(ex: /api/**)์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊ฐ FilterChain์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” FilterChainProxy๋Š” request๊ฐ€ ๋„์ฐฉํ–ˆ์„ ๋•Œ request์˜ url path๋ฅผ ํ™•์ธํ•ด ๋‹ค์ˆ˜ ๊ฐœ์˜ SecurityFilterChain ์ค‘ ์–ด๋–ค FilterChain์„ ์ ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์š”์ฒญ์€ ํ•˜๋‚˜์˜ FilterChain์—๋งŒ ๋งคํ•‘๋˜๋ฉฐ, ์ด์™ธ์˜ FilterChain์€ ๋ฌด์‹œ๋œ๋‹ค.

ํ•˜๋‚˜์˜ SecurityFilterChain ๋‚ด์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ผ

Authentication Architecture
  1. AuthenticationFilter๋Š” ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ฅผ ์š”์ฒญ ์ „๋ฐ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก SecurityContext์— ๋“ฑ๋กํ•œ๋‹ค.

  2. UsernamePasswordAuthenticationToken์€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋กœ, Principal, Credentials, Authorities์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

    • ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๋‘ ๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๋Š”๋ฐ, ๊ฐ๊ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

      // ์ธ์ฆ ์ด์ „์˜ ์‚ฌ์šฉ์ž ๊ฐ์ฒด ์ƒ์„ฑ
      public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
      		super(null);
      		this.principal = principal;
      		this.credentials = credentials;
      		setAuthenticated(false);
      }
      
      // ์ธ์ฆ ์ดํ›„์˜ ์‚ฌ์šฉ์ž ๊ฐ์ฒด ์ƒ์„ฑ
      public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
      			Collection<? extends GrantedAuthority> authorities) {
      		super(authorities);
      		this.principal = principal;
      		this.credentials = credentials;
      		super.setAuthenticated(true);
      }

      ์ฆ‰, authorities์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ์ƒ์„ฑํ•  ์‹œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด ์ •๋ณด๋ฅผ ๋„˜๊ธฐ๋ฉฐ ์ƒ์„ฑํ•˜๋ฉด ์ธ์ฆ ์ ˆ์ฐจ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ์ธ์ฆ ํ›„์˜ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  3. AuthenticationManager๋Š” ์•Œ๋งž์€ AuthenticationProvider์—๊ฒŒ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๋ผ์šฐํ„ฐ ์—ญํ• ์„ ํ•œ๋‹ค.

    • ์‹ค์ œ AuthenticationManager๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์—์„œ Provider์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ณ  ์œ„์ž„์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  4. AuthenticationProvider๋Š” ์‹ค์ œ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ธ์ฆ ์ด์ „์˜ ์‚ฌ์šฉ์ž ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ์ธ์ฆ ์ดํ›„์˜ ์‚ฌ์šฉ์ž ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    • UsernamePasswordAuthenticationToken์˜ ์ฒซ ๋ฒˆ์งธ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉ์ž ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, 3~4๋ฒˆ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ธ์ฆ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  5. Provider๋Š” UserDetailsService๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ธ์ฆ ์ „ Authentication ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํš๋“ํ•œ๋‹ค. ํ•ด๋‹น ์„œ๋น„์Šค ๊ฐ์ฒด์—๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์กฐํšŒํ•˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ loadUserByUsername ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

  6. ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋Š” UserDetails ๋ผ๋Š” Entity๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ €์žฅ๋˜๊ณ  ์กฐํšŒ๋œ๋‹ค. ์ด ํด๋ž˜์Šค์—๋Š” ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๋งŒ๋ฃŒ/์œ ํšจ์„ฑ ์—ฌ๋ถ€ ๋“ฑ์ด ์ €์žฅ๋˜๋ฉฐ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ Authority ์ •๋ณด๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋„ ํฌํ•จ๋œ๋‹ค.

Default Security Setting

Spring Security ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” path ์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ด์™ธ์˜ ์ ‘๊ทผ์ด ๊ธˆ์ง€๋œ๋‹ค.

๋กœ๊ทธ์ธ ๋ฐฉ์‹, path ๋ณ„ ๊ถŒํ•œ ๋“ฑ์˜ ์žฌ์„ค์ •์„ ์œ„ํ•ด์„œ๋Š” ์ปค์Šคํ…€ SecurityFilterChain์„ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ํ•ด๋‹น ํ•„ํ„ฐ ์ฒด์ธ ๋‚ด์—์„œ ๊ธฐ์กด ์„ค์ •๋“ค์„ Overridingํ•ด์•ผ ํ•œ๋‹ค.

Last updated