[Spring Security] Spring Security는 어떻게 동작할까?

정민규·2024년 12월 6일
0

Spring Security는 어플리케이션의 어디에서 동작하는가?

이전에 Spring을 이용한 어플리케이션의 기본적인 동작 원리에 대해 작성한 글이 있다.
[Spring] Spring의 기본 동작 과정과 @Controller와 @RestController의 차이

해당 글에 사용한 이미지를 다시 한번 보자.

위 그림을 보면, Spring 기반 어플리케이션은 기본적으로 모든 요청을 Dispatcher Servlet이 일단 받고, 해당 요청을 적절한 핸들러(우리가 구현해 놓은 컨트롤러)에게 위임하는 방식으로 동작한다.

이때, Spring Security는 Dispatcher Servlet 앞단에서 인터셉터를 통해 Dispatcher Servlet에게 가는 요청을 가로챈다. 1번과 10번 화살표 사이에 Spring Security 노드가 추가된다고 생각해도 좋다.

가로챈 요청은 Spring Security에서 제공하는 FilterChain을 따라서 인증과 권한 인가 및 각종 보안 검증을 거치며, 모든 검증 과정을 통과한 요청이 최종적으로 Dispatcher Servlet에게 넘겨지게 된다.

FilterChain에서 일어나는 일들

FilterChain은 말 그대로 여러가지의 필터들이 순차적으로 배열되어 있는 형태를 띄고 있다.
각 필터는 각자 고유의 역할을 수행하며, FilterChain에 등록되어있는 순서대로 실행된다.

정말 여러가지 필터들이 있지만, 대표적인 필터들과 그 실행 순서에 대해 알아보자.

  1. CORS 필터 : 보통 CORS 에러는 백엔드 쪽에서 Response의 헤더에 Access-Control-Allow쪽을 잘 만져주면 해결되는데, 이를 위한 필터라고 생각하면 된다. CORS에 대해서는 차후 자세히 다루어보도록 하겠다.

  2. CSRF 필터 : 악의적인 사용자가 일반 사용자로 하여금 만료되지 않은 인증 정보(세션 쿠키 등)을 이용해 의도치 않은 요청을 서버에 하도록 위조된 웹페이지에서 요청을 보내는 경우가 있다. 정상적인 웹 페이지에서 요청을 보내는 경우와 그렇지 않은 경우를 구분하기 위해 CSRF 토큰이라는 것을 발행하고, 서버는 매 통신마다 해당 CSRF 토큰을 검증하는데, 이러한 일을 수행하는 필터이다. CSRF 역시 나중에 자세히 다루어보도록 하겠다.

  3. 기본 로그인 페이지와 로그아웃 페이지 제공

  4. 인증 필터 (BasicAuthenticationFilter) : 인증 정보를 토대로 해당 요청의 사용자가 정확히 누구인지 인식하는 필터.

  5. 예외가 발생하는 경우, 이를 적절하게 클라이언트에게 돌려주는 필터(ExceptionTranslationFilter)

  6. 권한 인가 필터 (AuthorizationFilter) : 인증이 완료된 요청에 대해 적절한 권한과 자원을 부여해주는 필터

보통 필터들의 순서는 상술한 것과 비슷하다. 본격적인 인증과 인가과정 전에 체크해야 할 사항들 (CORS, CSRF)등을 먼저 처리하고, 그 과정에서 문제가 없을 경우에만 인증과 인가를 실시한다.

기본 제공 로그인 페이지에서 무슨 일이 일어날까?


Spring Security에서는 위 화면과 같은 기본 로그인 화면을 제공한다. 이때 우리의 서버에서 무슨 일이 일어나는지 한번 살펴보자.

  1. 클라이언트에서 http://localhost:8080/(리소스경로) 와 같이 특정한 요청을 하는 경우, Spring Security에서는 해당 요청을 가로채어 http://localhost:8080/login 으로 리다이렉션 시킨다.
    특이한 점은, 없는 리소스에 대한 요청에 대해서도 일단 로그인페이지로 리다이렉션 시킨다는 점이다. 즉, 클라이언트는 로그인을 통해 인증과 인가를 받지 않으면 해당 사이트에 무언가 요청을 할 때 해당 자원이 있는지 없는지 조차 파악할 수 없다.

  2. 로그인이 성공하는 경우, 서버는 본래 요청 주소로 다시 리다이렉션 시켜주며, 이때 아래와 같이 클라이언트에게 HTTP Response에 Set-Cookie 헤더를 통해서 세션 쿠키를 전달한다.

  1. 세션 쿠키를 전달받은 클라이언트는 이후 다른 요청을 할 때 해당 세션 쿠키를 헤더에 붙여서 요청을 하게 되고, 그 쿠키를 통해서 사용자를 식별하고 인증절차를 완료한다.

    (2단계에서 발급받은 세션 쿠키와 같은 값을 가지는 것을 확인할 수 있다.)
profile
조금이더라도 꾸준하게.

0개의 댓글

관련 채용 정보