사용자가 로그인을 요청하면 시큐리티가 username과 password를 가로채 서버 내부적으로 로그인을 실행한다. 정상적으로 완료가 된다면 시큐리티 세션에 유저정보를 담으며 이 유저정보는 스프링 IoC 컨테이너로 관리된다. 의존성 주입 또한 가능하다.
이 유저정보는 직접 모델링한 User 타입이 아닌 UserDetails라는 타입으로 저장해야한다. User 객체를 이용하려면 UserDetails에 다형성을 적용하여 User extends UserDetail을 사용하거나 password에 해쉬암호화를 적용하면 된다.
시큐리티의 구조
1.
로그인 요청의 내용을 가진 Http request는 username과 password를 포함한 body를 가진 채 AuthenticationFilter로 보내진다.
2.
AuthenticationFilter는 username과 password를 이용해 UsernamePasswordAuthenticationToken을 생성한다.
3.
만들어진 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 전송한다.
4.
5. 6. AuthenticationManager는 username을 UserDetailsService에게 전송하여 DB에서 해당 유저 이름을 검색한다.
7.
8. 만약 유저가 존재한다면 AuthenticationManager에게 돌려준다. DB에서 가져온 password가 AuthenticationManager가 가지고있는 encrypted password와 동일하다면, UsernamePasswodAuthenticationToken을 이용해 Authentication이라는 객체를 생성한다.
9.
세션 내에 위치한 SecurityContext에 Authentication 객체를 저장한다.