Spring Security
로그인 인증 과정
stophyeon
2024. 1. 16. 18:27
728x90
Spring security에서의 인증 과정
위 그림이 사용자가 Post /login으로 요청했을 때의 인증을 하는 과정을 나타낸 것입니다.
모르는 단어들이 정말 많지만 각자의 역할을 알게되면 이름이 저렇게 지어진 이유도 알 수 있습니다.
일단 요청의 처리과정을 보겠습니다.
1. Client의 Post /login 요청을 Filter가 받음
2. 요청을 받은 Filter에 따라 사용자의 인증에 관한 정보를 추출한뒤 Token을 생성
3.생성한 Token을 AuthenticationManager에게 전달하면 UserDetailsService에서 DB를 조회해 Data추출
4. 추출한 Data를 UserDetails객체로 생성
5. AuthenticationProvider에서 추출한 UserDetails객체와 Client의 요청의 Data를 비교
6. 일치하면 UserDetails객체에 권한을 부여
7. AuthenticationProvider가 SecurityContext에 객체를 전송하고 저장
위 과정을 보시면 각 요소의 역할이 명확합니다.
이제 각 요소들의 자세하게 들여다 보겠습니다.
Authentication Token
Authentication Token은 Filter에서 생성되는 객체라고 생각하시면 됩니다.
Token에는 사용자의 요청에 포함되어있는 인증 정보가 담겨있습니다.
Form Login을 할 경우에는 아이디, 비밀번호와 같은 정보가 Token에 있는 것입니다.
UserDetails
UserDetails는 Entity와 같은 역할을 하지만 다른점은 반드시 있어야 하는 필드값과 메서드들이 있다는 것입니다.
아래 사진과 같이 UserDetails를 상속받는 객체를 만들고 정의하는 방식으로 사용합니다.
필드 값으로는 권한을 가지고 있는 Collection<Grantedauthority>, 아이디와 비밀번호에 해당하는
String Username, String Password가 있습니다.
메서드들에는 필드값의 Getter/Setter외에 아래 4개의 메서드가 있습니다.
isAccountNonExpired() : 계정이 만료됐는지 리턴 -> true는 만료되지 않음
isAccountNonLocked() : 계정이 잠겨있는지 리턴 -> true는 잠기지 않음
isCredentialNonExpired() : 비밀번호가 만료됐는지 리턴 -> true는 만료되지않음
isEnabled() : 계정이 활성화돼 있는지 리턴 -> true는 활성화
UserDetailsService
UserDetailsService는 Token의 인증 정보와 일치하는 Data를 DB에서 조회하기 위한 서비스입니다.
UserDetailsService도 인터페이스이기 때문에 구현 클래스를 만들어 줘야 합니다.
Reopository를 통해 DB를 조회하는 것은 Security를 적용하지 않았을 때의 방식과 같습니다.
UserDetailsService의 구현 메서드는 DB에서 정보를 조회하는 메서드 하나입니다.
AuthenticationProvider
AuthenticationProvider와 Manager부터 내부구조를 이해해야 하기 때문에 어려워집니다.
만들어 놓은 UserDetails와 UserDetailsService를 어떻게 사용하는지가 나오기 때문입니다.
우선 Filter에서 생성된 Token을 받아서 인증 작업을 위임받게 됩니다. 그 다음으로 적절한 Provider에게
Token을 넘기고 Provider에서 UserDetailsService를 통해 DB를 조회하는 식입니다.
Provider에서 조회한 Data와 Token을 비교하는 인증이 진행됩니다.
AuthenticationProvider도 인터페이스이기 때문에 구현 클래스를 만들어야 합니다
authenticate메서드는 비교를하는 메서드로 userDetailsService를 통해 DB를 조회한후 가져온 객체와 Token의
password를 비교하는 부분입니다.
support 메서드는 이 Provider가 처리할 수 있는 Token을 선언하고 Manager가 support를 호출해 True값을 반환하면
해당 Provider에게 Token을 전송합니다.
AuthenticationManager
Manager에는 여러 Provider들이 존재할 수 있습니다. 여러 Provider들에게 support 메서드를 통해
처리 가능여부를 물어본 뒤에 true를 반환하는 Provider에게 Token을 전송하는데
AuthenticationManager는 인터페이스지만 Spring Security에서 구현 클래스인 ProviderManager를 제공합니다.
SecurityConfig파일에 위와 같은 메서드를 구현해서 Manager에 Provider를 넣을 수 있습니다.
하지만 로그인의 방식이 Form로그인만 있거나 OAth방식 한가지인 경우에는 builder에 UserDetailsService를 직접 넣어서 동작할 수 있습니다. 이렇게 되면 Provider가 필요없어 지게됩니다.