๐ข ๋ค์ด๊ฐ๊ธฐ ์ ์
์ด๋ฒ ํฌ์คํ ์์ 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์ ๋์ ๊ณผ์ ์ ์์๋ณด์๋ค.
์ ์ค๋ช ๋ง์ผ๋ก๋ ์ดํด๊ฐ ์ ์ ๋ ์๋ ์๋ค.
๋ค์ ํฌ์คํ ์์ ๋ก๊ทธ์ธ/ํ์๊ฐ์ ์์ ๋ฅผ ํตํด ํด๋น ๋์๊ณผ์ ์ ๋ ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ๋ค!
https://medium.com/datadriveninvestor/authentication-vs-authorization-716fea914d55
Authentication vs Authorization
Today I’m going to discuss two topics that most people tend to confuse. Both the terms are often used in conjunction with each other when…
medium.datadriveninvestor.com
https://spring.io/guides/topicals/spring-security-architecture
https://springbootdev.com/2017/08/23/spring-security-authentication-architecture