성준이의 공부블로그

Spring Security에 대하여 본문

SpringFramework

Spring Security에 대하여

Seong-Jun 2025. 7. 3. 10:42
728x90
반응형
SMALL

Spring Security

  • 스프링 기반 웹 애플리케이션의 보안 프레임워크입니다.
    • ➡️ 특히 인증(Authentication)인가(Authorization) 를 담당합니다.

사용자가 누구인지 확인하고 해당 사용자가 어떤 리소스에 접근이 가능한지 관리하는 역할을합니다.

인증(Authentication)

  • 사용자가 주장하는 신원을 확인하는 절차입니다.
    • 시스템이나 서비스에 접근하는 사용자가 실제 본인인지 확인하는 과정이라고도 할 수 있습니다.

누구인가를 확인하는 절차

인증의 중요성

  • 무단 접근을 방지하여 보안을 강화합니다.
    • ➡️ 보안강화
  • 허가되지 않는 접근으로 부터 보호합니다.
    • ➡️ 개인 정보 보호
  • 엄격한 액세스 제어 정책과 사용자 활동 추적을 지원합니다.
    • ➡️ 규정 준수

인가(Authorization)

  • 인증된 사용자나 시스템이 특정 리소스나 데이터에 접근하거나 특정 작업을 수행할 수 있는 권한을 부여하는 과정입니다.

인증된 사용자나 시스템이 무엇을 할 수 있는가를 결정하는 과정

인가의 중요성

  • 보안 유지
  • 중요한 리소스에 대한 무단 접근 방지

인증과 인가의 차이점

  • 인증은 신분 확인 과정이고 인가는 신분이 확인된 사용자가 어느 리소스에 접근이 가능한지 권한을 부여하는 과정입니다.

Spring Security의 보안 기능

  • CSRF 방지
  • 세션관리 등

Spring Security를 사용하지 않을 경우

  • JSP/Servlet 기반 프로젝트에서는 HttpSession을 기반으로 로그인한 사용자만 상품 등록, 상품 삭제 등의 기능을 사용할 수 있도록 구현했습니다. 또한 상품 삭제 시에는 세션 정보를 확인하여 해당 사용자가 해당 상품을 삭제할 권한이 있는지 검증하도록 처리했습니다.

  • 이를 위해 AccessFilter 를 공용 클래스로 작성하여 로그인 여부와 일부 권한 검증 로직을 중앙에서 관리하고 반복적인 코드를 줄였습니다.

  • 하지만 AccessFilter를 사용하더라도 URL 단위 접근 제어에만 가능하여 메서드 단위의 세밀한 권한 관리나 역할 기반 인가 등 고급 보안 정책을 적용하기 어렵다는 한계가 있었습니다.

  • 또한 JWT나 OAuth2 같은 다양한 인증 방식을 적용하거나 CSRF 보호, 세션 고정 방지 등 추가적인 보안 정책을 직접 구현해야 했기 때문에 유지보수와 확장성 측면에서 많은 어려움이 있었습니다.

Spring Security를 사용해야 하는 이유

  • 인증/인가를 체계적으로 관리해주므로 보안성을 높여줍니다.
  • 다양한 보안 기능을 제공해주므로 따로 보안 코드를 작성하지 않아도 됩니다.
  • 애플리케이션의 특성에 맞도록 유연하게 보안 설정이 가능합니다.

Spring Security의 동작 원리

먼저 Servlet Filter에 대한 이해가 필요합니다..

Servlet Filter

  • 클라이언트의 요청을 가로채서 Servlet이 수행되기 전후에 처리를 수행하거나 요청을 리다이렉트하는 용도로 사용합니다.

  • 일반적으로 한 개의 필터당 하나의 기능을 처리하므로 여러 기능이 필요한 경우 여러 개의 필터를 만들어 필터 체인을 형성하여 사용합니다.

  • Spring Security는 Security와 관련된 다양한 기능들을 필터 체인으로 제공합니다.
  • 예를 들면 인증되지 않은 사용자가 특정 URL을 요쳥했을 때 로그인 화면을 보여주는 기능이 Security Filter 중 하나에 의해서 처리된 것입니다.

Spring Security에서 사용하는 Filter

Filter Feature
SecurityContextPersistenceFilter SecurityContextRepository에서 SecurityContext 객체를 로딩하여 SecurityContextHolder에 저장하고 요청 처리가 끝나면 제거합니다.
LogoutFilter 지정한 경로의 요청이 들어오면 로그아웃하고 지정한 페이지로 이동합니다. 이후 필터들을 진행하지 않습니다.
UsernamePasswordAuthenticationFilter 로그인 요청이 들어오면 ID/PW 기반의 인증을 수행합니다. 성공 시 지정한 페이지로 이동하고 실패 시 로그인 화면을 보여줍니다.
DefaultLoginPageGeneratingFilter 로그인 요청이 들어오면 기본으로 제공하는 로그인 화면을 출력하고 이후 필터를 진행하지 않습니다.
AnonymousAuthenticationFilter 이 필터가 실행되는 시점까지 사용자가 인증을 받지 못했다면 임의 사용자에게 해당하는 Authentication 객체를 생성하여 SecurityContext에 설정합니다.
생성된 Authentication의 아이디는 anonymousUser이고 권한은 ROLE_ANONYMOUS이며 인증되지 않은 상태의 값을 가집니다.
SessionManagementFilter 세션 타임아웃, 동시 접근 제어, 세션 고정 공격 등을 처리합니다.
ExceptionTranslationFilter FilterSecurityInterceptor에서 발생한 예외를 맞는 응답으로 변환합니다. 예를 들어 403 상태코드를 응답하거나 로그인 페이지로 이동하는 작업을 처리합니다.
FilterSecurityInterceptor 현재 사용자가 지정한 경로에 접근할 수 있는지 여부를 검사합니다. 권한이 있으면 보안 필터를 통과시켜 자원에 접근할 수 있게 하고 권한이 없으면 예외를 발생시킵니다.
  • 각 필터는 Security 처리를 위한 기능으로 위에서부터 아래로 순차적으로 동작합니다.

Spring Security의 동작 원리 이해하기

  • Spring Security는 Security 필터들의 상호작용에 의해 처리됩니다.
  • Spring Security의 가장 중요한 필터는 UsernamePasswordAuthenticationFilter 입니다.
    • 이 필터가 사용자가 입력한 인증 정보를 이용해서 인증을 처리해주기 때문입니다.
  • 두번째로 중요한 객체는 FilterSecurityInterceptor입니다.
    • 이 객체는 인증에 성공한 사용자가 해당 리소스에 접근할 권한이 있는지를 검증하기 때문입니다.

Spring Security의 구조

  1. 사용자가 리소스 요청 시 인증 관리 필터가 요청을 가로챕니다.
  2. 인증 관리 필터는 인증 처리와 관련된 필터들을 이용하여 사용자 인증을 처리합니다.
    • 사용자가 인증 절차를 통해 인증 정보를 입력하면 파일이나 DB에 저장되어 있는 사용자 정보를 읽어 사용자가 입력한 인증 정보를 검증합니다.
    • 인증 실패 시 사용자에게 다시 인증 정보를 요청합니다.
    • 인증 성공 시 사용자가 요청한 리소스로 요청을 전달합니다.
  3. 인증 성공 후 요청한 리소스로 요청을 전달할 때 권한 관리 필터가 다시 요청을 가로 채서 리소스에 대한 접근 권한을 검증합니다.
    • 권한을 검증하기 위해 관련된 필터들을 사용하는데 권한 관리 필터는 리소스별 권한 목록을 참조하여 접근 권한을 검증합니다.
    • 검증 실패 시 권한 없음 페이지를 전송하거나 리소스에 대한 접근을 차단합니다.
728x90
반응형
LIST