[Spring] 보안 용어 및 스프링 시큐리티 개념

WOOK JONG KIM·2022년 11월 8일
1
post-thumbnail
post-custom-banner

보안 용어 이해

인증(Authentication)

사용자가 누구인지 확인 하는 단계 -> 대표적으로 로그인

DB에 등록된 아이디와 패스워드를 사용자가 입력한 아이디, 패스워드와 비교해서 일치 여부 확인
-> 로그인에 성공하면 애플리케이션 서버는 응답으로 사용자에게 토큰을 전달

인가(Authorization)

인증을 통해 검증된 사용자가 애플리케이션 내부의 리소스에 접근할때 사용자가 해당 리소스에 접근할 권리가 있느지 확인하는 과정을 의미
-> 특정 게시판에 접근해서 글을 보려하는 경우 게시판 접근 등급을 확인 해 접근을 허가하는 것

일반적으로 인증단계에서 발급받은 토큰은 인가 내용을 포함하고 있으며, 사용자가 리소스에 접근하면서 토큰을 함께 전달하면 서버는 토큰을 통해 권한 유무 등을 확인해 인가를 수행함

접근 주체(principal)

애플리케이션 기능을 사용하는 주체
ex) 사용자, 디바이스, 시스템


스프링 시큐리티

애플리케이션의 인증,인가 등의 보안 기능을 제공하는 스프링 하위 프로젝트

동작 구조

Servlet Filter를 기반으로 동작하며, DispatcherServlet 앞에 필터가 배치돼 있음

ApplicationFilterChain은 서블릿 컨테이너에서 관리

클라이언트에서 요청 -> 서블릿 컨테이너는 URI를 확인해서 필터와 서블릿을 매칭

스프링 시큐리티는 사용하고자 하는 필터 체인을 서블릿 컨테이너와 필터사이에서 동작시키기 위해 DelegatingFilterProxy를 사용

DelegatingFilterProxy는 서블릿 컨테이너의 생명주기와 스프링 애플리케이션 컨텍스트 사이에서 다리 역할을 하는 필터 구현체
-> 이는 역할을 위임할 FilterChainProxy를 내부에 가짐, 스프링에 의해 자동으로 생성됨

필터체인 프록시

필터체인 프록시는 스프링 시큐리티에서 제공하는 필터로 SecurityFilterChain을 통해 많은 보안필터를 사용 가능

필터체인 프록시에서 사용할 수 있는 보안 필터체인은 List 형식으로 담을 수 있게 설정돼 있어 URI 패턴에 따라 특정 보안필터 체인을 선택해서 사용하게 됨

보안 필터 체인 실행 순서

보안 필터 체인은 WebSecurityConfigurerAdapter 클래스를 상속받아 설정 가능
-> 여러 보안 필터체인을 만들기 위해선 상속받는 여러 클래스를 만들면 됨
-> 2개 이상의 클래스 생성 시 우선순위가 같으면 예외가 발생하기에 @Order를 통해 순서를 정의하는 것이 중요

별도의 설정이 없다면 스프링 시큐리티에서는 SecurityFilterChain에서 사용하는 필터 중 UsernamePasswordAuthenticationFilter를 통해 인증 처리

  1. 클라이언트로 부터 요청을 받으면 서블릿 필터에서 SecurityFilterChain으로 작업이 위임되고 그 중 UsernamePasswordAuthenticationFilter(AuthenticationFilter)에서 인증을 처리

  2. AuthenticationFilter는 요청 객체(HttpServletRequest)에서 username과 password를 추출해서 토큰 생성

  3. 이 후 AuthenticationManager에 토큰 전달, Manager는 인터페이스이며, 일반적으로 사용되는 구현체는 ProviderManager

  4. ProviderManager는 인증을 위해 AuthenticationProvider로 토큰 전달

  5. AuthenticationProvider는 토큰 정보를 UserDetailsService에 전달

  6. UserDetailsService는 전달 받은 정보를 통해 DB에서 일치하는 사용자를 찾아 UserDetails 객체를 생성

  7. 생성된 UserDetails 객체는 AuthenticationProvider로 전달되며, 해당 Provider에서 인증을 수행하고 성공하게 되면 ProviderManager로 권한을 담은 토큰 전달

  8. ProviderManager는 검증된 토큰을 AuthenticationFilter로 전달

  9. AuthenticationFilter는 검증된 토큰을 SecurityContextHolder에 있는 SecurityContext에 저장

위에서 사용한 AuthenticationFilter는 접근 권한을 확인하고 인증이 실패할 경우 로그인 폼이라는 화면을 보내는 역할 수행

화면이 없는 RESTful 애플리케이션의 경우 다른 필터에서 인증 및 인가를 수행하는데 다음 장에서 JWT 토큰을 사용해 인증을 수행할 예정이라 JWT 관련 필터를 생성하고 UsernamePasswordAuthenticationFilter를 앞에 배치해서 먼저 인증을 수행할 수 있게 설정

profile
Journey for Backend Developer
post-custom-banner

0개의 댓글