Spring

Spring Security | Spring Security란?

이진유진 2024. 3. 11. 17:20
반응형

Spring Security?

Spring 기반의 Java 웹 애플리케이션에서 보안을 담당하는 프레임워크입니다. 

주로 웹 애플리케이션에서 사용자 인증(Authentication) 및 권한 부여(Authorization)와 관련된 다양한 보안 기능을 제공합니다. 

 

Spring Security는 개발자들이 보안 관련 기능을 효율적이고 신속하게 구현할 수 있도록 도와줍니다. 

IoC/DI 패턴과 같은 확장 패턴을 염두해, 인증/인가 부분을 직접 개발하기 쉽지 않은데, Spring Security에서는 이와 같은 기능들을 제공해 개발 작업의 효율을 높일 수 있습니다. 

 

주요 특징과 개념

  1. 인증(Authentication)
    • Spring Security는 다양한 인증 방식을 지원하는데, 기본적으로 폼 기반 로그인, HTTP 기본 인증, 기존의 사용자 데이터베이스와의 연동을 통한 사용자 인증을 제공합니다. 
    • 추가로 LDAP,OAuth, OpenID, SAML 등 다양한 인증 프로토콜을 지원합니다. 
  2. 권한 부여(Authorization)
    • Spring Security는 애플리케이션 리소스에 대한 접근 권한을 관리합니다. 사용자 또는 그룹에 대한 권한을 설정하여 특정 리소스에 접근할 수 있는지를 결정합니다. 
    • 권한 부여를 위해 자주 사용되는 개념으로 Role, Authority가 있습니다. 
  3. 세션 관리 및 CSRF 방어
    • Spring Security는 세션 관리를 통해 사용자의 로그인 상태를 유지하고, 필요에 따라 세션 타임아웃 및 세션 고정 공격과 같은 보안 공격으로부터 보호합니다. 
    • CSRF(Cross-Site Request Forgery) 공격 방어를 위한 기능도 제공합니다. 
  4. 보안 이벤트 및 로깅 
    • Spring Security는 인증 및 권한 부여 과정에서 발생하는 다양한 보안 이벤트를 처리하고, 이를 로깅하여 보안 이슈를 감지하고 추적할 수 있도록 합니다. 
  5. 사용자 정의 필터 및 확장성 
    • 필터 체인을 통해 사용자 정의 보안 로직을 적용할 수 있습니다. 이를 통해 애플리케이션의 특정 요구 사항에 따라 보안 설정을 확장하고 조정할 수 있습니다. 
  6. Spring Boot와 통합
    • Spring Boot와의 높은 통합성을 제공하여, 간단한 설정으로 기본적인 보안 설정을 갖추고 있는 웹 어플리케이션을 쉽게 구성할 수 있습니다. 
  7. CSRF 방어 및 클릭재킹 방어 등의 고급 보안 기능 

 

Spring Security Architecture 

 

Spring의 요청 처리 과정

https://www.elancer.co.kr/blog/view?seq=235

 

위의 그림은 Spring에서 프레임워크나 라이브러리를 사용하였을 때, 작동되는 구조를 표현한 그림입니다. 

붉은색 박스 부분이 Spring 프레임워크에서 Spring Security가 적용되는 부분입니다. 

 

각각의 영역에 대하여 간단하게 알아보겠습니다. 

SpringContextHolder

  • SpringContextHolder는 스프링 애플리케이션에서 현재 사용중인 ApplicationContext를 관리하는 유틸리티 클래스 입니다.
  • 이 클래스를 통해 ApplicationContext에 쉽게 접근할 수 있습니다. 
  • Spring Application은 ApplicationContext라는 스프링 컨테이너를 가지며, ApplicationContext는 빈(Bean)의 생성과 관리, 의존성 주입(Dependency Injection) 등을 담당합니다. 
  • SpringContextHolder는 ApplicationContext에 접근하여 빈을 검색하거나 다른 스프링 관련 작업을 수행하는데 사용됩니다. 
  • 보통 SpringContextHolder를 사용하지 않고, 직접 ApplicationContext 에 의존성 주입(DI)를 통해 접근하는 것이 권장되는 방법입니다. 
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextHolder implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextHolder.applicationContext = applicationContext;
    }

    public static <T> T getBean(Class<T> beanClass) {
        return applicationContext.getBean(beanClass);
    }

    // 다양한 다른 유틸리티 메서드들을 추가할 수 있습니다.
}

 

위의 예제에서 SpringContextHolder는 ApplicationCotnextAware 인터페이스를 구현하고,

스프링 컨테이너에서 ApplicationContext를 주입받습니다.

 

SecurityContextHolder는 Spring Security의 핵심 구성 요소로, 

현재 실행 중인 스레드에 대한 보안 컨텍스트 정보를 저장하고 추출할 수 있는 메커니즘을 제공합니다. 

보안 컨텍스트에는 현재 인증된 사용자에 대한 인증 객체 및 권한 정보(사용자 아이디, 유저 이름, 비밀번호 등)가 포함됩니다. 

 

SecurityContextHolder 주요기능

  • 보안 컨텍스트 저장 : 현재 스레드에 대한 보안 컨텍스트 정보를 저장하여, 애플리케이션 내 어디에서나 해당 정보에 쉽게 접근할 수 있습니다. 
  • 보안 정보 검색 : 쉽게 현재 인증된 사용자의 인증 객체 및 권한 정보를 검색할 수 있도록 메소드를 제공합니다. 이를 통해 사용자으 ㅣ권한을 확인하거나 인증 여부를 확정할 수 있습니다. 

 

 

 

 

반응형