Spring Security

Kkd·2024년 12월 9일
0

매일메일 개념정리

목록 보기
21/93
post-thumbnail

Spring Security란?

Spring Security는 애플리케이션의 인증(Authentication)인가(Authorization)를 담당하는 스프링 기반 보안 프레임워크입니다.
주로 웹 애플리케이션과 REST API의 보안을 처리하며, 개발자가 보안 관련 로직을 일일이 구현하지 않도록 많은 기본 제공 기능을 제공합니다.


Spring Security의 핵심 기능

  1. 인증(Authentication)
    사용자의 신원을 확인하는 과정.

    • 예: 로그인 시 사용자 아이디와 비밀번호 확인.
  2. 인가(Authorization)
    인증된 사용자가 어떤 리소스에 접근할 수 있는지를 확인하는 과정.

    • 예: 일반 사용자가 관리자 페이지에 접근하지 못하도록 제한.
  3. CSRF 보호
    웹 애플리케이션에서 CSRF(Cross-Site Request Forgery) 공격을 방지.

  4. 세션 관리

    • 사용자 세션 생성 및 만료 관리.
    • 동시 세션 제어 기능.
  5. 암호화 지원

    • 비밀번호 암호화(BCryptPasswordEncoder) 및 다양한 암호화 알고리즘 지원.

Spring Security의 주요 구성 요소

  1. SecurityFilterChain
    HTTP 요청을 가로채 인증 및 인가를 처리하는 필터 체인.
    필터는 특정 순서대로 실행되며, 각각의 필터는 인증, 인가, 세션 관리 등의 역할을 담당.

  2. AuthenticationManager
    인증을 처리하는 핵심 구성 요소.

    • 사용자의 로그인 정보를 검증하고 인증된 사용자 객체를 반환.
  3. UserDetailsService
    사용자 정보를 로드하기 위한 인터페이스.

    • DB 또는 외부 API에서 사용자 정보를 가져오는 로직을 구현.
  4. GrantedAuthority
    사용자가 가지고 있는 권한 정보를 나타내는 인터페이스.

  5. SecurityContext
    인증된 사용자의 정보를 저장.

    • SecurityContextHolder를 통해 애플리케이션 전역에서 접근 가능.
  6. Authentication
    인증 객체로 사용자 정보와 권한을 포함.

    • 인증 전: 사용자 입력 정보 저장.
    • 인증 후: 사용자 정보와 권한 정보 저장.

Spring Security의 동작 과정

  1. 사용자가 요청 전송
    클라이언트가 특정 URL로 요청을 보냅니다.

  2. 필터 체인 실행
    SecurityFilterChain에 등록된 필터가 순차적으로 실행됩니다.

    • 인증 필터에서 사용자의 자격 증명을 확인.
  3. 인증 처리

    • 사용자의 자격 증명이 유효하면 AuthenticationManager가 인증을 성공 처리.
    • 실패 시, 인증 실패 응답 반환.
  4. 인가 처리

    • 인증된 사용자에게 요청한 리소스에 대한 권한이 있는지 확인.
    • 권한이 없으면 403 Forbidden 응답 반환.
  5. 요청 처리 및 응답 반환

    • 인증 및 인가가 성공하면 애플리케이션 로직 실행 후 클라이언트에 응답 반환.

Spring Security 설정 방법

스프링 부트 3.x 이상에서는 SecurityFilterChain을 사용한 Java Config 방식이 일반적입니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable() // CSRF 보호 비활성화
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/admin/**").hasRole("ADMIN") // 관리자 권한 필요
                .requestMatchers("/user/**").authenticated() // 인증 필요
                .anyRequest().permitAll() // 기타 요청 허용
            )
            .formLogin() // 기본 로그인 페이지 제공
            .and()
            .logout(); // 로그아웃 지원

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(); // 비밀번호 암호화
    }
}

Spring Security의 확장 가능성

  1. 커스텀 인증 로직

    • UserDetailsService를 구현하여 사용자 인증 데이터 커스터마이징.
    • 외부 API 또는 OAuth2 서버와 연동 가능.
  2. 인가 정책 커스터마이징

    • 메서드 레벨에서 접근 제어: @PreAuthorize, @PostAuthorize
    • 표현식 기반 정책 설정 가능.
  3. OAuth2 및 JWT 통합

    • OAuth2를 통해 소셜 로그인 구현.
    • JWT를 사용해 무상태(stateless) 인증 처리.

Spring Security의 장점

  1. 보안 표준 준수:
    다양한 보안 기능(CSRF, 세션 관리 등)을 기본 제공.

  2. 유연성:
    다양한 인증 및 인가 방식을 손쉽게 확장 가능.

  3. 커뮤니티 및 문서 지원:
    활발한 커뮤니티와 공식 문서, 예제가 풍부.

  4. 스프링 생태계와의 통합:
    Spring Boot, Spring Data 등과 자연스럽게 통합 가능.


Spring Security 도입 시 고려할 점

  1. 학습 곡선:
    기본적인 설정 외의 고급 기능을 활용하려면 깊이 있는 학습이 필요.

  2. 성능:
    잘못된 필터 설정이나 무거운 인증 방식은 성능 저하를 유발할 수 있음.

  3. 테스트:
    인증 및 인가 로직에 대한 테스트를 별도로 작성해야 함.


Spring Security는 강력하면서도 유연한 보안 프레임워크로, 애플리케이션의 인증과 인가 요구 사항을 체계적으로 처리합니다. 이를 통해 개발자는 보안 로직에 신경 쓰기보다 비즈니스 로직에 더 집중할 수 있습니다.

추가 학습 자료

profile
🌱

0개의 댓글