프로젝트를 진행하면서 Spring Security를 활용해서 회원 로그인/로그아웃 처리 과정을 구현 했었다.
당시 시간이 촉박하다는 핑계로 상세하게 들여다보지 않고 로그인이 되는 상세 처리 과정만 이해하고 넘어갔었다.
위와 같은 흐름 정도만 이해하고 넘어갔었다.
조금 더 깊게 Spring Security 동작 원리에 대해 알아보자.
스프링 시큐리티 (Spring Security)는 스프링 기반 어플리케이션의 보안(인증과 권한, 인가)을 담당하는 스프링 하위 프레임워크.
보안과 관련해서 체계적으로 많은 옵션들을 제공해주기 때문에 개발자의 입장에서는 하나하나 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.
Spring Security는 기본적으로 인증 절차를 거친 후 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지를 확인한다. 이러한 인증과 인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 인증 방식을 사용한다.
spring security 에서는 기본적으로 세션 - 쿠키 방식을 사용하고 있다.
일반적인 Form Login 절차
요청 수신
토큰 생성
AuthenticationFilter로 부터 인증용 객체를 전달 받는다.
Token을 처리할 수 있는 Authentication Provider 선택
인증 절차
UserDetailsService의 loadUserByUsername메소드 수행
AuthenticationProvider 인터페이스에서 DB에 있는 사용자의 정보를 가져오려면, UserDetailsService 인터페이스를 사용한다.
UserDetailsService 인터페이스는 화면에서 입력한 사용자의 username으로 loadUserByUsername() 메소드를 호출하여 DB에 있는 사용자의 정보를 UserDetails 형으로 가져온다. 만약 사용자가 존재하지 않으면 예외를 던진다. 이렇게 DB에서 가져온 이용자의 정보와 화면에서 입력한 로그인 정보를 비교하게 되고, 일치하면 Authentication 참조를 리턴하고, 일치 하지 않으면 예외를 던진다.
인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담은 이후 AuthenticationSuccessHandle를 실행한다.(실패시 AuthenticationFailureHandler를 실행한다.)
아이디와 비밀번호를 사용하는 form 기반 인증
설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리인 AuthenticationManager를 통한 인증 실행
인증이 성공한다면 인증용 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
실패한다면 AuthenticationFailureHandler 실행
화면에서 입력한 로그인 정보와 DB정보를 비교
Spring Security의 AuthenticationProvider을 구현한 클래스로 security-context에 provider로 등록 후 인증절차를 구현한다.
login view에서 login-processing-url로의 form action 진행 시 해당 클래스의 supports() > authenticate() 순으로 인증 절차 진행
UserDetailsService 인터페이스는 DB에서 유저 정보를 가져오는 역할
사용자의 정보를 담는 인터페이스, 직접 상속받아 사용한다.
실제 내가 진행했던 프로젝트에서 UserDetails 인터페이스를 구현하게 되면 오버라이딩 되는 메소드 들이 있다. 그리고 회원 정보에 관한 다른 정보(이메일, 나이, 주소 등)를 추가하기도 했었다. 오버라이딩 되는 메소드들만 Spring Security에서 알아서 사용하기 때문에 별도로 클래스를 만들지 않고 멤버변수를 추가해서 같이 사용해도 무방하다.
해당 멤버변수들은 getter, setter를 만들어서 사용하면 된다.
처음 Spring Security를 접했을때도 생소하고 어려웠다. 흐름만 알고 넘어갔는데 이렇게 조금 더 세부적으로 알아보니..그래도 어렵다. 이렇게 하나하나 정리하다 보니 정말 배움에는 끝이 없다고 느낀다. 더 많겠지 앞으로 더 많아지겠지 설렌다 하하
잘 읽고 갑니다~~