본문 바로가기

Language/Spring Security

기본 인증 필터 - BasicAuthenticationFilter

  • 폼 인증 필터에서 처리하는 과정과 흡사하고 간단
  • 기본 인증 서비스를 제공하는데 사용
  • BasicAuthenticationConverter를 사용하여 요청 헤더에 기술된 인증 정보의 유효성을 체크하며, Base64 인코딩된 username과 password를 추출
    • 유효성 체크
      • 클라이언트가 보낸 Request 헤더에 Authorization이 없으면 인증 처리 X
      • Authorization 헤더명은 있으나 Basic이 없으면 인증 처리 X
  • 인증 이후 세션을 사용하는 경우와 사용하지 않는 경우에 따라 처리되는 흐름에 차이가 있음
    • 기본적으로 BasicAuthenticationFilter는 세션을 사용하지 않음
    • 세션을 사용하는 경우 매 요청마다 인증 과정을 거치지 않으나, 세션을 사용하지 않는 경우 매 요청마다 인증 과정을 거침

흐름도

  1. 클라이언트가 Get 방식으로 “/loign” URL 요청
  2. BasicAuthenticationFilter에서 유효성 검증(Authorization 헤더명, Basic 포함 확인)
  3. 유효성 검증 성공 → UsernamePasswordAuthenticationToken에 username + password 저장
  4. AuthenticationManager에 토큰 전달 → 인증 성공 or 실패

인증 성공

  1. UsernamePasswordAuthenticationToken에 재 생성
    • 유저 정보(UserDetails or User)와 권한 정보(Authorities) 정보를 담아서 저장
  2. SpringContextHolder
    • Authentication을 SecurityContext에 설정
    • 요청 컨텍스트에 SecurityContext 저장(폼 인증 필터에서는 세션에 저장)
      • 요청 범위 내에서만 인증 상태가 유지
      • 요청 컨텍스트 때문에 요청이 끝나고 응답이 가게 되면 인증 상태가 유지 되지 않음
      • 기본적으로 HTTP Basic 인증은 요청 헤더에다가 계속적으로 이 값을 보내줘야만 인증을 받는 식
  3. RememberMeService
  4. chain.doFilter ⇒ 애플리케이션 로직을 계속 실행

인증 실패

  1. SecurityContextHolder ⇒ 삭제
  2. RememberMeServices ⇒ 기억하기가 있다면 삭제
  3. AuthenticationEntryPointWWW-Authenticate를 보내도록 호출
    • 다시 인증을 받아야하기 때문에 폼 인증처럼 페이지를 제공하는 것이 아니라, WWW-Authenticate를 보냄