๐ค ์คํ๋ง ์ํ๋ฆฌํฐ?
์คํ๋ง ๊ธฐ๋ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ณด์(์ธ์ฆ๊ณผ ์ธ๊ฐ)์ ๋ด๋นํ๋ ํ๋ ์์ํฌ๋ฅผ ๋งํฉ๋๋ค.
์ธ์ฆ(Authentication)
๋ก๊ทธ์ธ ๊ณผ์ ์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์์คํ ์๊ฒ ์์ ์ ์๋ณํ ์ ์๋ ์๊ฒฉ์ฆ๋ช (์์ด๋, ๋น๋ฐ๋ฒํธ, ํ ํฐ ๋ฑ)์ ์ ๊ณตํ๊ณ , ์์คํ ์ด ์ด๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
์ธ๊ฐ(Authorization)
์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์ด๋ค ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋์ง ๋๋ ์ด๋ค ๋์์ ์ํํ ์ ์๋์ง๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ ์ฆ, ์ ๊ทผ ๊ถํ์ ์ป๋ ์ผ์ ๋งํฉ๋๋ค.
๋ค์ํ ๋ณด์ ๊ธฐ๋ฅ, ์ธ์ฆ ๋ฐฉ์, ์ ์ด ๋ฉ์ปค๋์ฆ์ ์ง์ํ์ฌ ๋ณด๋ค ๊ฒฝ๋ ฅํ ๋ณด์์ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ฐ๋ฐ์๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ํตํด ๋ณด์ ๊ด๋ จ ๋ก์ง์ ์์ฑํ์ง ์์๋ ๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋์๋ ์ปจํธ๋กค๋ฌ์์ ์ง์ ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ๊ตฌํํ๊ฑฐ๋ Interceptor๋ฅผ ํตํด ์ปจํธ๋กค๋ฌ์ ๋์ฐฉํ๊ธฐ ์ ์ธ์ฆ๊ณผ ์ธ๊ฐ์์ ์ ์ํํ ์ ์์์ต๋๋ค.
ํ์ง๋ง ์คํ๋ง ์ํ๋ฆฌํฐ๋ ์คํ๋ง MVC์ ๋ถ๋ฆฌ๋์ด ์ฌ์ฉ์์ ์์ฒญ์ด ๋ณด๋ด์ง๋ฉด DispatcherServlet์ ๋๋ฌํ๊ธฐ ์ ์ ํํฐ ์ฒด์ธ์ ํตํด ์ธ์ฆ๊ณผ ์ธ๊ฐ์์ ์ ์ํํฉ๋๋ค.
โ ์คํ๋ง ์ํ๋ฆฌํฐ ๊ตฌ์กฐ
๐ 1. ํํฐ ์ฒด์ธ(FilterChain)
์ฌ์ฉ์ ์์ฒญ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํ๋์ ํํฐ ์ฒด์ธ์ ์์ฑํฉ๋๋ค.
ํํฐ์ ์ํด ์์ฒญ์ด ํํฐ๋ง๋์์ ๋, HttpServletResponse๋ฅผ ๋ง๋ค์ด ์๋ธ๋ฆฟ ๋์ ์ฌ์ฉ์์๊ฒ ์๋ตํ ์ ์์ต๋๋ค.
๋ฐ๋๋ก ํํฐ๋ง ๋์ง์๊ณ ๋ค์์ผ๋ก ์ ๋ฌ๋๊ฒ ํ ๊ฒฝ์ฐ HttpServletRequest๋ HttpServletResponse์ ๋ด์ฉ์ ๋ณ๊ฒฝํ์ฌ ๋ค์ ํํฐ๋ ์๋ธ๋ฆฟ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
๐ 2. DelegatingFilterProxy
์คํ๋ง ์ํ๋ฆฌํฐ๋ ํํฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ด์ฉํ์ฌ ์ธ์ฆ๊ณผ ๊ถํ ์์ ์ ์ํํฉ๋๋ค.
ํ์ง๋ง ํํฐ์ ์๋ช ์ฃผ๊ธฐ ์์ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์๋ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋น์ ์ธ์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์คํ๋ง ์ํ๋ฆฌํฐ์์๋ DelegatingFilterProxy๋ผ๋ ์๋ธ๋ฆฟ ํํฐ ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ธ๋ฆฟ ๋งค์ปค๋์ฆ์ ํตํด ์๋ธ๋ฆฟ์ ํํฐ๋ก ๋ฑ๋ก๋ ์ ์์ผ๋ฉฐ ์คํ๋ง์ ๋ฑ๋ก๋ ๋น์ ๊ฐ์ ธ์ ์์กด์ฑ์ ์ฃผ์ ํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ DelegatingFilterProxy๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ์ ์คํ๋ง์ ApplicationContext์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๋ค๋ฆฌ ์ญํ์ ํ๊ฒ ๋ฉ๋๋ค.
DelegatingFilterProxy์์๋ ์๋ธ๋ฆฟ ํํฐ์์ ๋ฐ์ ์์ฒญ๊ณผ ์๋ต์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ ํํฐ๋ก ์ ๋ฌํฉ๋๋ค.
๐ 3. FilterChainProxy
DelegatingFilterProxy์ ๋ด๋ถ์๋ FilterChainProxy๊ฐ ์์ต๋๋ค.
FilterChainProxy๋ DelegatingFilterProxy๋ฅผ ํตํด ๋ฐ์ ์์ฒญ๊ณผ ์๋ต์ SecurityFilterChain์ ์ ๋ฌํ๊ณ ์์ ์ ์์ํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ฐ๋ก SecurityFilterChain์ ์คํํ ์ ์์ง๋ง, ์ค๊ฐ์ FilterChainProxy๋ฅผ ๋ ์ผ๋ก์จ ์๋ธ๋ฆฟ์ ์ง์ํ๋ ์์์ ์ญํ ์ ํ๊ธฐ ์ํด์์ ๋๋ค.
๋ง์ฝ ์๋ธ๋ฆฟ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด FilterChainProxy์ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋ฐ๋ก ์ ์ ์์ต๋๋ค.
๋ํ SecurityFilterChain์ด ์ฌ๋ฌ ๊ฐ๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ, DelegatingFilterProxy์๋ FilterChainProxyํ๋๋ง ๋๊ณ ์ฌ๋ฌ ๊ฐ์ SecurityFilterChain ์ค ์ ํํ์ฌ ์์ ์ ์์ํ ์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
๐ 4. SecurityFilterChain
์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ์ฌ๋ฌ ๊ฐ์ SecurityFilter๋ฅผ ๋ด๋ ํํฐ ์ฒด์ธ์ ๋๋ค.
FilterChainProxy๋ฅผ ํตํด ์๋ธ๋ฆฟ ํํฐ์ ์ฐ๊ฒฐ๋๊ณ , ์ด๋ค SecurityFilter๋ฅผ ํตํด ์ธ์ฆ์ ์ํํ ์ง ๊ฒฐ์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฌ๋ฌ ๊ฐ์ SecurityFilterChain์ ๊ตฌ์ฑํ์ฌ ์์ฒญ๋๋ URL์ ๋ฐ๋ผ ๋ค๋ฅธ SecurityFilterChain์ด ์ฌ์ฉ๋๋๋ก ํ ์ ์์ต๋๋ค.
๐ 5. SecurityFilter
์์ฒญ์ ์คํ๋ง ์ํ๋ฆฌํฐ ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ ํํฐ์ ๋๋ค.
DelegatingFilterProxy์ FilterChainProxy๊ฐ ์๋ธ๋ฆฟ๊ณผ ์คํ๋ง๊ณผ์ ์ฐ๊ฒฐ์ ๋ด๋นํ๋ค๋ฉด, SecurityFilter๋ ์ํ๋ฆฌํฐ์ ํต์ฌ ๊ธฐ๋ฅ์ ์ํํ๋ ์ง์ ์ ๋๋ค.
SecurityFilter๋ SecurityFilterChain API๋ฅผ ํตํด FilterChainProxy์ ์ฝ์ ๋๊ณ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค.
โ ์คํ๋ง ์ํ๋ฆฌํฐ ์ธ์ฆ ๊ณผ์
1. ์ฌ์ฉ์์ ์๊ฒฉ์ฆ๋ช (์์ด๋, ๋น๋ฐ๋ฒํธ)์ด Form์ ํตํด ์์ฒญ๋ฉ๋๋ค.
2. ์์ฒญ์ AuthenticationFilter๋ฅผ ๊ฑฐ์ณ ์์ฒญ๋ ์ ๋ณด๋ฅผ ํตํด ์ธ์ฆ๋๊ธฐ ์ UsernamePasswordAuthenticationToken์ 1์ฐจ๋ก ์์ฑํฉ๋๋ค.
3. AuthenticationManager๋ ๋ฑ๋ก๋ AuthenticationProvider๋ค์ ์กฐํํ์ฌ ์ธ์ฆ์ ์๊ตฌํฉ๋๋ค.
4. ์ค์ DB์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ UserDetailsService์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋๊ฒจ์ค๋๋ค.
5. ๋๊ฒจ๋ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํตํด DB์์ ์ฐพ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ UserDetails ๊ฐ์ฒด๋ก ๋ง๋ญ๋๋ค.
6. AuthenticationsProvider๋ค์ UserDetails๋ฅผ ๋๊ฒจ๋ฐ๊ณ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋น๊ตํฉ๋๋ค.
public class MemberService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Member member = memberRepository.findByEmail(email);
if( member == null ){
throw new UsernameNotFoundException(email);
}
return new MemberDetails(member); // MemberDetails๋ UserDetails์ ๊ตฌํ์ฒด
}
}
UserDetailsService๋ ๋ก๊ทธ์ธ ํ์ด์ง์์ ์ ๋ ฅํ ์์ด๋๋ฅผ ํตํด loadUserByUsername๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
loadUserByUsername์ DB์ ์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ UserDetails ํํ๋ก ๋ฆฌํดํฉ๋๋ค.
7. AuthenticationsProvider๋ค์ ๋ฆฌํด๋ UserDetails์ ์ ๋ ฅ๋ฐ์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์ผ์นํ๋ฉด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
[์ธ์ฆ ์ฑ๊ณต]
8. ์ธ์ฆ์ ์ฑ๊ณตํ๊ฒ ๋๋ฉด AuthenticationManager๋ ๋ฐํ๋ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํฌํจํ์ฌ ์ธ์ฆ๋ ํ์ UsernamePasswordAuthenticationToken(Authentication)์ 2์ฐจ๋ก ์์ฑํ๊ณ AuthenticationFilter๋ก ๋ณด๋ ๋๋ค.
9. Authentication๊ฐ์ฒด๋ฅผ SecurityContext์ ์ ์ฅํฉ๋๋ค, ์ด๋ 1์ฐจ ์บ์์ ์ญํ ์ ์ํํ๋ฉฐ ์ธ์ฆ ์ดํ ์ฌ์ฉ์๊ฐ ๋ค์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด SecurityContext๊ฐ์ฒด ์์ Authentication์ด ์๋์ง ํ์ธํฉ๋๋ค.
๐ Reference
https://dev-coco.tistory.com/174
https://www.boostcourse.org/web326/lecture/58997?isDesc=false
https://limdevbasic.tistory.com/19
https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5/#servlet-security-filters
'Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ์์กด๊ด๊ณ ์๋ ์ฃผ์ (0) | 2024.02.10 |
---|---|
[Spring] ์ปดํฌ๋ํธ ์ค์บ (0) | 2024.02.08 |