[Spring Security] Spring Security 기초

정동아·2023년 7월 11일

백엔드 부트캠프

목록 보기
39/41

Spring Security의 기본 구조

  • Spring Security의 기본 구조와 기본적인 동작 방식을 이해하기 가장 좋은 인증 방식은 '폼 로그인 인증' 방식이다.

  • Spring Security를 이용한 보안 설정은 HttpSecurity를 파라미터로 가지고, SecurityFilterChain을 리턴하는 Bean을 생성하면 된다.

  • HttpSecurity 를 통해 Spring Security에서 지원하는 보안 설정을 구성할 수 읶다.

  • 로컬 환경에서 Spring Security를 테스트 하려면 CSRF설정을 비활성화해야한다.

  • InMemoryUserDetailsManager 를 이용해서 데이터 베이스 연동 없이 테스트만 목적으로 하는 InMemory User를 생성할 수 있다.
    (Spring Security에서 지원하는 InMemory User는 말 그대로 메모리에 등록되어 사용되는 User이므로 애플리케이션 실행이 종료되면 InMember User 역시 메모리에서 사라진다.)

  • Spring Security는 사용자의 크리덴셜을 암호화하기 위한 PasswordEncoder를 제공하며, PasswordEncoder는 다양한 암호화 방식을 제공한다.
    Spring Security에서 제공하는 PasswordEncoder의 디폴트 암호화 알고리즘은 bcrypt이다.

  • 사용자의 크리덴셜(Credential)이란 해당 사용자를 증명하기 위한 구체적인 수단을 의미한다. (일반적으로는 사용자의 패스워드가 크리덴셜에 해당)

  • 패스워드같은 민감한 정보는 반드시 암호화되어 저장해야하고, 패스워드는 복호화할 이유가 없으므로 단방향 암호화 방식으로 암호화 되어야한다.

  • Spring Security에서 관리하는 User정보를 UserDetails로 관리한다.

  • UserDetails는 UserDetailsService에 의해 로드되는 핵심 User정보를 표현하는 인터페이스이다.
    UserDetailsService는 User 정보를 로드(load)하는 핵심 인터페이스

  • Custom UserDetailsService를 사용해 로그인 인증을 처리하는 방식은 Spring Security가 내부적으로 인증을 대신 처리해 주는 방식이다.


Spring Security의 웹 요청 처리 흐름

Spring Security의 웹 요청 처리전에 먼저 보안이 적용된 웹 요청의 일반적인 흐름부터 정리하자.

위 이미지는 보안이 적용된 사용자의 웹 요청에 대한 일반적인 처리 흐름을 표현한 것이다.

요청 처리 흐름은 다음과 같다.

  • (1) 사용자가 보호된 리소스를 요청한다.

  • (2) 인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜을 요청한다.

  • (3) 사용자는 인증 관리자한테 크리덴셜을 제공한다.

  • (4) 인증 관리자는 크리덴셜 저장소에서 사용자의 크리덴셜을 조회한다.

  • (5) 인증 관리자는 사용자가 제공한 크리덴셜과 저장소에 있는 크리덴셜을 비교해서 검증 작업을 수행한다.

  • (6) 유효한 크리덴셜이 아니면, Exception 을 throw 한다.

  • (7) 유효하다면, (8)에서 접근 결정 관리자 역할을 하는 컴포넌트는 사용자가 적절한 권한을 부여받았는지 검증한다.

  • (9) 적절한 권한을 부여받지 못한 사용자라면, Exception을 throw한다.

  • (10) 적절한 권한을 부여받은 사용자라면, 보호된 리소스의 접근을 허용한다.

이 과정에서 보면 사용자의 웹 요청이 Controller같은 엔드포인트를 거쳐서 접근하려는 리소스에 가기 전에 인증 관리자나 접근 결정 관리자같은 컴포넌트가 중간에서 웹 요청을 가로챈다음 사용자의 크리덴셜과 접근 권한을 검증하는 것을 알 수 있다.

이렇게 서블릿 기반 애플리케이션의 경우, 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공하는데 그게 서블릿 필터(Servlet Filter)이다.
서블릿 필터는 하나 이상의 필터들을 연결해서 필터 체인을 구성할 수 있다.

Spring Security의 필터는 클라의 요청을 중간에서 가로챈 뒤에 보안에 특화된 작업을 처리하는 역할을 한다.
DelegatingFilterProxy는 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할을 한다.
Spring Security 의 Filter Chain 은 Spring Security에서 보안을 위한 작업을 처리하는 필터의 모음이며, Spring Security의 필터를 사용하기 위한 진입점이 바로 FilterChainProxy이다.

서블릿 필터 관련 정보 확인

Spring Security에서 지원하는 Filter 목록

0개의 댓글