스터디/테크톡

[테크 톡 - 5주차] Spring Security

냠냠쿠 2023. 8. 10. 13:03
728x90

📌Spring security

  • 스프링 기반의 어플리케이션 보안(인증, 권한, 인가 등)을 담당하는 스프링의 하위 프레임워크

◾ 보안 용어

용어뜻

인증 (Authenticate) 접근하려는 유자가 누구인지 확인
인가 (Authorization) 인증된 사용자에 대해서 권한을 확인하고 허락
접근 주체 (Principal) 보호된 대상에 접근하는 유저
비밀번호 (Credential) 대상에 접근하는 유저의 비밀번호
  • Spring Security는 기본적으로 인증 절차를 거친 후 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지를 확인한다. 이러한 인증과 인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 인증 방식을 사용한다.
    spring security 에서는 기본적으로 세션 - 쿠키 방식을 사용하고 있다.
  • 인증 (Authentication) → 인증 성공 후 → 인가 (Authorization)

◾ 동작 과정

  1. 유저가 로그인 요청
  2. AuthenticationFilter 에서 UsernamePasswordAuthentication Token 을 생성하여 AuthenticationManager 에 전달
  3. AuthenticationManager 은 등록된 AuthenticationProvider 들을 조회하여 인증 요구
  4. AuthenticationProvider 은 UserDetailService 를 통해 입력받은 아이디에 대한 사용자 정보를 DB 에서 조회
  5. 로그인 정보가 있는 경우 UserDetails 로 꺼내서 유저 session 생성
  6. 인증이 성공된 UsernameAuthenticationToken 을 생성하여 AuthenticationManager 로 반환
  7. AuthenticationManager 은 UsernameAuthenticationToken 을 AuthenticationFilter 로 전달
  8. AuthenticationFilter 은 전달받은 UsernameAuthentication 을 LoginSuccessHandler 로 전송하고, spring security 인메모리 세션저장소인 SecurityContextHolder 에 저장
  9. 유저에게 session ID 와 응답을 내려줌

용어뜻

AuthenticationFilter - 모든 request는 인증, 인가를 위해 이 필터를 통과
- 인증 성공 시 Authentication 객체를 SecurityContext 에 저장 후 AuthenticationSuccessHandler 실행
- 인증 실패 시 AuthenticationFailureHandler 실행
UsernamePasswordAuthenticationToken - Authentication을 구현한 AbstractAuthenticationToken의 하위 클래스
AuthenticationManager - Authentication 을 생성 및 처리하는 인터페이스
- 로그인시 인자로 받은 Authentication 을 Provider 를 통해 유효한지 처리하여 Authentication 객체를 리턴
ProviderManager - AuthenticationManager 의 구현체
- 사용자 요청을 인증에 필요한 AuthenticationProvider 를 살펴보고 전달된 인증 객체를 기반으로 사용자 인증 시도
AuthenticationProvider - 실제 인증을 담당하는 인터페이스
- 인증 전 Authentication 객체를 받아 DB에 있는 사용자 정보와 비교하고 인증된 객체 반환
UserDetails - 사용자의 정보를 담는 인터페이스
SecurityContextHolder - SecurityContext 를 현재 스레드와 연결
SecurityContext - Authentication 의 정보를 가지고 있는 인터페이스
Authentication - 현재 접근하는 주체의 정보와 권한을 담는 인터페이스

🔸 UserDetails의 기본 메서드

메서드이름리턴 값

getAuthorities() 계정의 권한 목록 리턴
getPassword() 계정의 PW 리턴
getUsername() 계정의 고유한 값 리턴
isAccountNonExpired() 계정 만료여부 리턴
isAccountNonLocked() 계정의 잠김 여부 리턴
isCredentialsNonExpired() 비밀번호 만료 여부 리턴
isEnabled() 계정 활성화 여부 리턴

◾ 필터

1. Filter

  • 스프링 시큐리티는 서블릿 필터를 기반으로 동작
  • 일반적으로 클라이언트에서 서버로 요청을 보내면 DispatcherServlet이라는 서블릿이 하나의 HttpServeletRequest를 받아서 요청을 처리하고 HttpServletResponse 응답을 클라이언트로 보내지만, 하나 이상의 필터가 포함된다면, 클라이언트에서 보낸 요청이 서블릿으로 전달 되기 전에 필터를 거침
  • 클라이언트가 어플리케이션에 요청을 보내면 컨테이너는 하나의 필터체인을 생성
    필터체인 안에는 필터와 서블릿이 들어있으며 필터 체은 내부의 필터는 클라이언트에서 보낸 요청이 다름 필터나 서블릿에 전달되지 않도록 걸러냄
  • 필터에서 요청이 다음으로 전달되지 못하도록 걸러냈을 경우 필터 내부에서 HttpServletResponse를 만들어 서블릿 대신에 클라이언트에 응답을 보낼 수 있음.
  • 요청이 다음으로 전달되게 할 경우 HttpServletRequest나 HttpServletResponse의 내용을 변경하여 가공된 데이터를 다음 필터나 서블릿에 전달


출처 : https://limdevbasic.tistory.com/19

2. DelegatingFilterProxy

  • 사용자의 요청이 서블릿에 전달되어 자원에 접근하기 전에 스프링 시큐리티는 필터의 생명주기를 이용해서 인증과 권한 작업을 수행
  • 서블릿 필터의 생명주기 시점에서 스프링 시큐리티에서 동작하는 인증과 권한 작업을 수행해야하는데 서블릿 컨테이너에서는 스프링 컨테이너에 등록된 빈을 인식 X
    → 따라서 DelegatingFilterProxy라는 서블릿 필터의 구현체를 제공
    서블릿 매커니즘을 통해 서블릿의 필터로 등록 될 수 있으며 스프링에 등록된 빈을 가져와 의존성을 주입할 수 있고 DelegatingFilterProxy는 서블릿 컨테이너의 생명주기와 스프링의 ApplicationContext 사이를 연결하는 다리 역할을 하게 됨.


출처 : https://limdevbasic.tistory.com/19

3. FilterChainProxy

  • DelegatingFilterProxy 를 통해 받은 요청과 응답을 스프링 시큐리티 필터체인에 전달하고 작업을 위임하는 역할을 함.


출처 : https://limdevbasic.tistory.com/19

4. SecurityFilterChain

  • 인증을 처리하는 여러 개의 시큐리티 필터를 담는 필터 체인
    어떤 시큐리티 필터를 통해 인증을 수행할지 결정
  • 여러개의 SecurityFilterChain을 구성하여 매칭되는 URL에 따라 다른 SecurityFilterChain이 사용 되도록도 가능.

 

5. Security Filters

  • 요청을 스프링 시큐리티 매커니즘에 따라 처리하는 필터
  • 시큐리티의 핵심기능을 수행
  • SecurityFilterChain API를 통해 FilterChainProxy에 삽입되고 스프링 빈으로 등록
728x90