🔑 Spring Security란?
- 인증(Authentication), 인가(authorizaion)에 대한 처리를 위임하는 Spring의 하위 프레임워크
🔑 Spring Security의 용어
- 인증 (Authentication) : 사용자가 본인인지 확인하는 절차 (확인 절차)
- 인가 (Authorization) : 인증된 사용자가 요청한 자원에 접근이 가능한지 결정하는 절차 (허락 절차)
- 접근 주체 (Principal) : 보호받는 Resource에 접근하는 대상
- 비밀번호 (Credential) : Resource에 접근하는 대상의 비밀번호
- 권한 : 인증 과정을 통해 주체가 증명된 이후 권한 부여
🔑 Spring Security의 동작 원리
- Spring Security는 인증, 인가의 순서로 진행
- 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인
- 인증, 인가 과정을 위해 Principal을 아이디로 Credential을 비밀번호로 사용하는 인증 방식을 사용
1. 요청 수신
<- 사용자가 form을 통해 로그인 정보가 담긴 Request를 전송
2. 토큰 생성
- AuthenticationFilter가 요청을 받아서 UsernamePasswordAuthenticationToken(인증용 객체) 생성
- 인증용 객체 해당 요청을 처리할 수 있는 Provider을 찾는데 사용
3. AuthenticationManager에게 인증용 객체를 전달
- AuthenticationManager는 Provider를 List 형태로 갖고 있음
4. AuthenticationManager 인터페이스를 거쳐 AuthenticationProvider에 정보 전달
- Token을 처리할 수 있는 AuthenticationProvider 선택
- 등록된 AuthenticationProvider들을 조회하여 인증을 요구
5. AuthenticationProvider는 UserDetailsService를 통해 입력받은 사용자의 username으로 loadUserByUsername() 메소드를 호출해서 DB에서 조회
- DB에 있는 사용자의 정보를 UserDetails형으로 가져옴
- authenticate() 메소드를 통해 DB에 저장된 정보와 입력한 로그인 정보(인증용 객체) 비교
- 일치하는 경우 Authentication 반환(return), 일치하지 않으면 예외
6. 인증이 완료되면 사용자 정보를 가진 인증용 객체를 SecurityContextHolder에 담은 후 AuthenticationSueccessHandle을 실행(실패 시, AuthenticationFailureHanlder 실행)
🔑 로그인 과정
- 로그인 시도(ID, password 입력) -> username(ID)와 password가 HTTP BODY로 전달
- 인증 관리 -> UserDetailsService에게 username을 전달하고 회원 상세정보를 요청
- DB에서 회원 조회 -> 조회된 정보를 UserDetails로 변환
- 인증 관리자가 인증 처리 -> UserDetailsService가 전달해준 UserDetails의 정보와 클라이언트가 시도한 username, password 일치 여부 확인
- UserDetails의 password는 암호문이기 때문에 클라이언트가 보낸 password를 암호화하여 비교