๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ข ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  Spring Security๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ง€์—๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

์ธ์ฆ, ์ธ๊ฐ€, ๋ณด์•ˆ ์ฃผ์ฒด

Spring Security๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ์— ์•ž์„œ ๋ณด์•ˆ ์šฉ์–ด์— ๋Œ€ํ•ด ์ˆ™์ง€ํ•ด์•ผํ•œ๋‹ค.

์ธ์ฆ(Authentication)
์ž…์ฆ, ์ฆ๋ช…์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.
์•”ํ˜ธํ™” ๊ฐ™์€ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฒ€์ฆํ•˜์—ฌ ์‚ฌ์šฉ์ž ID๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ณดํ†ต ์ด ์ธ์ฆ์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„(ID)์™€ ์•”ํ˜ธ(PW)๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.
์ธ์ฆ์€ ๋‹จ์ผ๋ถ€ํ„ฐ 2๋‹จ๊ณ„, ๋‹ค์ค‘ ์ธ์ฆ๊นŒ์ง€ ๊ฑฐ์น  ์ˆ˜ ์žˆ๋‹ค.

์ธ๊ฐ€(Authorization)
ํ—ˆ๊ฐ€, ๊ถŒํ•œ ๋ถ€์—ฌ๋ผ๊ณ ๋„ ํ•œ๋‹ค.
์ธ์ฆ(Authentication) ์ดํ›„์— ๋ฐœ์ƒํ•˜๋Š” ๊ณผ์ •์œผ๋กœ, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œ์Šคํ…œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

๋ณด์•ˆ ์ฃผ์ฒด(Principal)
Principal์€ ์ง์—ญํ•˜๋ฉด '์ฃผ๋œ'์ด๋ผ๊ณ  ํ•ด์„๋œ๋‹ค.
์ฆ‰, ๋ณด์•ˆ ์‹œ์Šคํ…œ์ด ์ž‘๋™๋˜๊ณ  ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๋Š” ์œ ์ €(์ฃผ์ฒด)๋ฅผ ๋งํ•œ๋‹ค.

๐Ÿ”‘ Spring Security๋ž€?

Spring Security๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ(์ธ์ฆ๊ณผ ๊ถŒํ•œ, ์ธ๊ฐ€ ๋“ฑ)์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํ”„๋ง ํ•˜์œ„ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

๐Ÿ”‘ Spring Security ๋™์ž‘ ๊ณผ์ •

์œ„ ์ด๋ฏธ์ง€๋Š” Spring Security์˜ ๋™์ž‘๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

์ด๋ฏธ์ง€์˜ ๋ฒˆํ˜ธ์™€ ํ•จ๊ป˜ ์•„๋ž˜ ๋™์ž‘ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ณด์ž.

1. HTTP ์š”์ฒญ ์ˆ˜์‹ (Http Request) ๋ฐ AuthenticationFilter ํ†ต๊ณผ

Spring Security๋Š” ์ผ๋ จ์˜(์—ฐ๊ฒฐ๋œ) ํ•„ํ„ฐ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์š”์ฒญ(request)์€, ์ธ์ฆ(Authentication)๊ณผ ๊ถŒํ•œ๋ถ€์—ฌ(Authorization)๋ฅผ ์œ„ํ•ด ์ด ํ•„ํ„ฐ๋“ค์„ ํ†ต๊ณผํ•˜๊ฒŒ ๋œ๋‹ค.
์ด ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ณผ์ •์€, ํ•ด๋‹น ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ์ธ์ฆ ํ•„ํ„ฐ(์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜/๋ชจ๋ธ์— ๊ธฐ๋ฐ˜ํ•œ ๊ด€๋ จ ์ธ์ฆ ํ•„ํ„ฐ)๋ฅผ ์ฐพ์„ ๋•Œ ๊นŒ์ง€ ์ง€์†๋œ๋‹ค.

์˜ˆ)
HTTP Basic ์ธ์ฆ ์š”์ฒญ์€ BasicAuthenticationFilter์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ํ•„ํ„ฐ ์ฒด์ธ์„ ํ†ต๊ณผํ•œ๋‹ค.
HTTP Digest ์ธ์ฆ ์š”์ฒญ์€ DigestAuthenticationFilter์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ํ•„ํ„ฐ ์ฒด์ธ์„ ํ†ต๊ณผํ•œ๋‹ค.
๋กœ๊ทธ์ธ form submit ์š”์ฒญ์€ UsernamePasswordAuthenticationFilter์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ํ•„ํ„ฐ ์ฒด์ธ์„ ํ†ต๊ณผํ•œ๋‹ค.
X509 ์ธ์ฆ ์š”์ฒญ์€ X509AuthenticationFilter ๋“ฑ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ํ•„ํ„ฐ ์ฒด์ธ์„ ํ†ต๊ณผํ•œ๋‹ค.

์ด ํ•„ํ„ฐ ์ฒด์ธ ์ค‘ ์ธ์ฆ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ AuthenticationFilter๋ผ๊ณ  ํ•œ๋‹ค.
AuthenticationFilter๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ID(JSESSIONID)๊ฐ€ Security Context์— ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
(์—ฌ๊ธฐ์„œ Security Context๋ž€ ์•„๋ž˜์˜ ๋ชจ๋“  ๋กœ์ง์„ ํ†ต๊ณผํ•œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด(์ธ์ฆ ๊ฐœ์ฒด)๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.)
Security Context์— ์„ธ์…˜ ID๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ž˜ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

2. ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ AuthenticationToken ์ƒ์„ฑ

์ธ์ฆ ์š”์ฒญ(request)์ด ๊ด€๋ จ AuthenticationFilter์— ์˜ํ•ด ์ˆ˜์‹ ๋˜๋ฉด ์ˆ˜์‹ ๋œ ์š”์ฒญ์—์„œ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
์ด ์ถ”์ถœ๋œ ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…(credentials)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ฅผ UsernamePasswordAuthenticationToken์ด๋ผ๊ณ  ํ•œ๋‹ค.

3. AuthenticationManager๋ฅผ ์œ„ํ•ด ์ƒ์„ฑ๋œ AuthenticationToken ์œ„์ž„

๋งŒ๋“ค์–ด์ง„ UsernamePasswordAuthenticationToken๋Š” AuthenticationManager์˜ ์ธ์ฆ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
์—ฌ๊ธฐ์„œ AuthenticationManager๋Š” ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์‹ค์ œ ๊ตฌํ˜„์€ ProviderManager์ด๋‹ค.

ProviderManager ์—๋Š” ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ธ์ฆ์— ํ•„์š”ํ•œ AuthenticationProvdier ๋ชฉ๋ก์ด ์žˆ๋‹ค.
ProviderManager๋Š” ์ œ๊ณต๋œ ๊ฐ AuthenticationProvdier๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ „๋‹ฌ๋œ ์ธ์ฆ ๊ฐœ์ฒด(UsernamePasswordAuthenticationToken)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์‹œ๋„ํ•œ๋‹ค.

4. AuthenticationProvider ๋ชฉ๋ก์œผ๋กœ ์ธ์ฆ ์‹œ๋„

AuthenticationProvider๋Š” ์ œ๊ณต๋œ ์ธ์ฆ ๊ฐœ์ฒด๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•œ๋‹ค.

์•„๋ž˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” AuthenticationProvider์˜ ์ผ๋ถ€์ด๋‹ค.

  • CasAuthenticationProvider
  • JaasAuthenticationProvider
  • DaoAuthenticationProvider
  • OpenIDAuthenticationProvider
  • RememberMeAuthenticationProvider
  • LdapAuthenticationProvider

5. UserDetailsService / 6. UserDetails / 7. User

์ผ๋ถ€ AuthenticationProvider(ex. DaoAuthenticationProvider)๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„(username)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด UserDetailService๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
UserDetailsService๋Š” DB์— ์ €์žฅ๋œ ํšŒ์›์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋น„๊ตํ•ด ์ผ์น˜ํ•˜๋ฉด UserDetails ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

UserDetailsService๋Š” Spring Security์˜ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์ด๋ฅผ UserDetailsService๋ฅผ ๊ตฌํ˜„ํ•œ ์„œ๋น„์Šค๋Š” ์ง์ ‘ ๊ฐœ๋ฐœํ•ด์•ผํ•œ๋‹ค.(customize)

public interface UserDetailService {
    UserDetail loadUserByUsername(String username) throws UsernameNotFoundException;
}

์ฆ‰, ์œ„ ์ฝ”๋“œ์˜ loadUserByUsername ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด DB์™€ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์„ ์ง์ ‘ ์งœ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
DB ์™€ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ VO๋กœ User ๋”ฐ์œ„๋ฅผ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

(์ด ๋ถ€๋ถ„์€ ๋‚˜์ค‘์— ๋”ฐ๋กœ ์‹ค์Šต ํฌ์ŠคํŒ…์—์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.)

8. AuthenticationException

AuthenticationProvider ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ธ์ฆ๋˜๋ฉด, ์™„์ „ํžˆ ์ฑ„์›Œ์ง„ ์ธ์ฆ๊ฐœ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
์ธ์ฆ์— ์‹คํŒจํ•˜๋ฉด AuthenticaionException์ด ๋ฐœ์ƒํ•œ๋‹ค.
AuthenticaionException์ด ๋ฐœ์ƒํ•˜๋ฉด ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•˜๋Š” AuthenticationEntryPoint์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

9. ์ธ์ฆ ์™„๋ฃŒ!

AuthenticationManager๋Š” ํš๋“ํ•œ ์™„์ „ํžˆ ์ฑ„์›Œ์ง„ ์ธ์ฆ๊ฐœ์ฒด๋ฅผ ๊ด€๋ จ ์ธ์ฆ ํ•„ํ„ฐ(AuthenticationFilter)๋กœ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค

10. SecurityContext์—์„œ ์ธ์ฆ ๊ฐœ์ฒด ์„ค์ •

๊ด€๋ จ AuthenticationFilter๋Š” ํ–ฅํ›„ ํ•„ํ„ฐ ์‚ฌ์šฉ์„ ์œ„ํ•ด ํš๋“ํ•œ ์ธ์ฆ ๊ฐœ์ฒด๋ฅผ SecurityContext์— ์ €์žฅํ•œ๋‹ค.
SecurityContext๋Š” 1๋ฒˆ ๋กœ์ง์—์„œ ์„ค๋ช… ํ–ˆ์—ˆ๋‹ค. ์ด SecurityContext์— ์ธ์ฆ๊ฐœ์ฒด๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , 

์ธ์ฆ ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

SecurityContextHolder.getContext().setAuthentication(authentication);

Spring Security์˜ ๋™์ž‘ ๊ณผ์ •์„ ์•Œ์•„๋ณด์•˜๋‹ค.

์œ„ ์„ค๋ช…๋งŒ์œผ๋กœ๋Š” ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„  ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋™์ž‘๊ณผ์ •์„ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค!

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | ์ž๊ธฐ๊ณ„๋ฐœ | ๋ฏธ๋ผํด ๋ชจ๋‹ | ์ผ์ƒ