Spring Security 로그인 동작 원리

Codren·2021년 10월 14일
1

Spring Security 로그인

프로젝트 진행중에 처음으로 접해본 Spring Security 로그인 기능에 대해 정리가 제대로 되지 않은 느낌을 받음. 로그인에 사용되는 각 요소들과 그들의 연관관계를 제대로 파악하여 동작 원리에 대해서 정확히 이해하고 로그인의 전체적인 흐름을 그려보기 위해 정리를 함



UserDetailsService

로그인이 정상적으로 이루어지려면 클라이언트 측에서 보낸 ID / PW 가 DB 내에 존재하는 특정 회원의 ID / PW 와 일치해야함. 여기서 사용자가 보낸 데이터와 비교할 회원 정보를 DB 에서 조회해야 되는 데, 이 때 사용되는 것이 UserDetailService 인터페이스. 인터페이스이므로 implements 키워드를 이용하여 구현해야하는데, 보통 회원(Member)을 관리하는 Service 객체가 이를 구현함




loadUserByUsername

UserDetailsService 인터페이스에서 오버라이딩을 수행해야 할 메소드. 사용자가 입력한 Username (ID)을 이용하여 실질적으로 DB 내에서 해당 값과 일치하는 회원(Member)을 조회하여 조회한 회원 정보를 UserDetails 인터페이스 타입으로 반환하는데, 보통 Spring Security 에서 제공하는 UserDetails 인터페이스 구현체인 User 객체를 반환함




WebSecurityConfigurerAdapter

SpringSecurityFilterChain 에 필터를 추가하기 위한 @Configuration 클래스. 애플리케이션의 보안 (인증 및 인가)을 위한 필터 및 설정을 지정하기 위해 여러 configure 메소드를 오버라이딩함




configure(HttpSecurity http)

Http 요청에 대한 security 설정을 지정하는 메소드

  • formLogin() - http 를 통해 들어오는 form 기반 request 를 이용하여 Login 을 처리
.loginPage("/member/login")		// 해당 URL의 Post 요청은 로그인으로 간주, 또는 로그인이 필요한 자원에 접근할 때 로그인이 되어있지 않다면 해당 페이지로 이동
.defaultSuccessUrl("/")			// 로그인 성공 시 redirect URL
.usernameParameter("email")		// Post 요청으로 들어오는 데이터중 "email" 데이터를 ID로 설정함
.failureUrl("/member/login/fail")	// 로그인 실패 시 redirect URL
.and()
.logout()				// 로그아웃 기능 수행
.logoutRequestMatcher(new AntPathRequestMatcher("/member/logout"))	// 해당 URL 요청에 대해서 로그아웃 수행
.logoutSuccessUrl("/");			// 로그아웃 후 redirect URL




configure(AuthenticationManagerBuilder auth)

실제로 인증을 담당하는 AuthenticationManager 를 생성하는 메소드. http.formLogin() 에서 지정한 URL 로 로그인 요청이 들어오면 userDetailsService 에서 조회한 User 객체와 비밀번호의 암호화 방식을 이용하여 사용자가 보낸 ID / PW 와 비교해 실질적으로 로그인 검증을 수행하는 부분




로그인 동작 원리

  1. 클라이언트 측에서 ID / PW 를 입력하여 로그인 요청을 보냄
  2. 서블릿 필터 부분에서 http.formLogin() 에 지정된 URL 패턴을 발견하여 로그인 검증 수행
  3. AuthenticationManager 가 userDetailsService - loadUserByUsername 을 이용하여 DB 내의 회원 정보를 담은 User 객체와 패스워드 암호화 방식을 가져옴
  4. 클라이언트 측에서 보낸 ID / PW 와 User 객체의 ID / PW 와 비교하여 일치하면 SuccessUrl 로 보냄





로그인에 감사함을 느낌...

0개의 댓글