Spring 의 HTTP 요청과 Spring Security 동작

이영재·2025년 4월 19일

Spring

목록 보기
16/20

먼저 스프링 시큐리티 동작을 알아보기 전에 Spring에서 http 요청을 어떻게 처리 하는지 알아봅시다.

1. Spring 의 HTTP 요청 처리 방식

스프링에서는 요청을 처리하는 방법이 크게 2가지 있는데

Spring MVC

  • 전통적인 서블릿 기반의 동기 처리 방식.
  • HTTP 요청을 하나의 스레드가 처리하며, 스레드가 요청의 처리 완료까지 대기
  • 블로킹 I/O를 사용하기 때문에 요청이 많아질 경우 스레드 풀 크기에 따라 병목이 발생할 수 있다.

Spring WebFlux

  • 비동기 및 논블로킹 I/O를 사용하여 설계된 리액티브 프로그래밍 방식.
  • Netty 또는 Undertow와 같은 비동기 웹 서버와 함께 사용 가능
  • 스레드가 요청에 묶이지 않고, 비동기 콜백 방식으로 요청을 처리

Spring MVC에 Spring WebFlux기능 추가 가능
Spring MVC 방식을 따르면서 메서드만 Spring WebFlux 방식을 따르도록 설정이 가능합니다.

글에서는 Spring MVC 방식을 기준으로 설명하겠습니다.

1.1 Servlet

서블릿이란?
서블릿(Servlet)이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술

왜 Servlet 이 필요할까?

  • 개발자들이 텍스트를 직접 해석하고 분석하여 처리를 하는게 너무 힘들다!
  • http의 규약을 확인해가며 텍스트로 들어온 요청을 처리해야함

Servlet Architecture


1. 클라이언트에서 URL 호출
2. 웹서버에서 URL을 확인하여 해당 서블릿으로 요청 전달, 없으면 서블릿 클래스의 init()으로 생성
3. 서블릿 컨테이너는 요청정보를 HttpServletRequest, HttpServletResponse 두 객체에 저장
4. 서블릿 클래스의 service()메소드 호출 (HTTP Method에 따라 서블릿의 doGet, doPost 호출)
5. 요청 처리 후 HttpServletResponse 객체에 HTTP 데이터를 담아 응답
6. 웹서버가 클라이언트에 응답처리
7. 서블릿의 destroy() 호출하여 GC에 의해 서블릿 종료

-> Spring MVC 에서는 DispatcherServlet으로 대부분의 요청을 처리한다.

DispatcherServlet Architecture

  • DispatcherServlet : 요청을 관제하는 컨트롤러

1.2 Servlet Container

Servlet Container : WAS 의 Servlet Container 는 서블릿의 생명 주기를 관리하고, HTTP 요청/응답 처리, 보안 관리를 관리합니다

  • 내장 WAS 에는 여러가지 컨테이너들이 존재하고 여러가지 기능을 제공
  • ex) JPA 컨테이너, 메시징 컨테이너 등

1.3 Servlet Container 주요 역할 정리

  • HTTP 요청/응답 처리
    • 클라이언트로부터 들어온 HTTP 요청을 받아 적절한 서블릿으로 라우팅.
    • 서블릿이 처리한 결과를 HTTP 응답으로 클라이언트에게 반환.
  • 서블릿의 생명주기 관리
  • 서블릿 객체의 생성, 초기화, 요청 처리, 소멸을 관리.
  • 보안 관리
    • HTTPS, 인증(Authentication), 권한(Authorization)을 지원

2. Spring Security 란?

스프링 기반 웹 애플리케이션에서 인증(Authentication)과 권한(Authorization)을 담당하는 스프링의 하위 프레임워크

  • 인증(Authentication) : 시스템에 접근하기 위해 식별 가능한 정보 (이름 , 이메일)를 이용하여 회원의 정보를 확인하는 것
  • 인가(Authorization) : 특정 리소스에 접근하려는 회원의 권한을 확인하는 것

Spring Security (Security 5.7 이후) 특징
1. Filter 기반으로 동작
2. Bean으로 설정 가능
3. Spring Security는 기본적으로 세션 & 쿠키 방식으로 인증
4. 인증관리자(Authentication Manager)접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리

2.1 Spring Security를 사용하는 이유

Spring Security는 인증(Authentication)권한(Authorization) 관리뿐만 아니라 다양한 보안 기능을 간단히 설정하고 확장할 수 있는 강력한 도구이다.

기본 보안 제공

  • CSRF 방어, 세션 고정 공격 방어, 비밀번호 암호화(BCrypt) 등 보안의 기본기를 제공.
  • 몇 줄의 코드로 안전한 애플리케이션 구축 가능.

다양한 인증 방식 지원

  • 세션 기반 인증, JWT, OAuth2 같은 현대적인 인증 방식을 손쉽게 구현.
  • 소셜 로그인(Google, Facebook)과 같은 OAuth2 연동도 간단.

높은 생산성과 확장성

  • 기본 설정으로 빠르게 시작 가능하지만, 필요에 따라 Custom Filter, Authentication Provider 등으로 확장 가능.

2.2 Spring Security

Spring Security 동작

Spring Security 공식 문서

스프링부트 3.0에서 시큐리티 설정 방법 변경 + 시큐리티 6.0.0이상의 버전이 적용

주요 내용 : SecurityFilterChain을 반환하고 Bean으로 등록함으로써 컴포넌트 기반의 보안설정이 가능

실제 동작 순서

  1. 클라이언트 요청 → Servlet 컨테이너 수신.
  2. FilterChain 실행:
    • DelegatingFilterProxy 호출 → Spring Security 필터 체인 실행.
    • Spring Security 필터 체인:
      • 인증(Authentication).
      • 권한 부여(Authorization).
      • 보안 작업.
  3. 필터 체인 통과 후 → DispatcherServlet 호출.
  4. DispatcherServlet → 컨트롤러 호출 → 응답 생성.

  • @Configuration : 클래스를 Spring 컨테이너에서 설정 클래스로 인식하도록 지정
  • @EnableWebSecurity : Spring Security에서 제공하는 어노테이션으로, Spring Security를 활성화

2.3 Spring Security 인증 로직

1. 사용자 로그인 요청

  • 사용자가 아이디와 비밀번호를 입력하고 서버로 로그인 요청 전송

2. UsernamePasswordAuthenticationFilter 작동

  • 해당 필터가 로그인 요청을 감지하여
  • 아이디/비밀번호 정보를 담은 Authentication 객체를 생성

3. AuthenticationManager가 인증 처리

  • AuthenticationManager가 인증 책임자 역할을 하며,
  • 내부적으로 UserDetailsService와 PasswordEncoder를 활용해 DB와 비교

4. 인증 성공 처리

  • 인증에 성공하면 인증된 Authentication 객체가 생성되고,
  • SecurityContextHolder에 저장되어 인증 상태 유지

5. 세션에 저장

  • SecurityContextPersistenceFilter가 SecurityContext를 세션(HttpSession)에 저장
  • 이후부터는 세션을 통해 인증된 사용자로 간주

6. 인증된 사용자만 접근 허용

  • 인증된 사용자는 SecurityContext를 통해 인증 상태를 확인받고
  • 권한(Role)에 따라 요청 리소스 접근이 가능함

7. 인증 실패 처리

  • 아이디 또는 비밀번호가 틀리면 AuthenticationFailureHandler가 동작하여
  • 실패 응답 또는 에러 메시지를 반환

0개의 댓글