Spring Security는 Spring 프레임워크에 통합된 강력한 인증(Authentication)과 권한 부여(Authorization)를 제공하는 보안 프레임워크입니다. 웹 애플리케이션이나 API에서 사용자 인증접근 제어를 쉽게 구현하고 보안 수준을 높일 수 있도록 다양한 기능과 설정을 제공합니다.

Spring Security의 주요 개념

  1. 인증(Authentication): 사용자가 누구인지 확인하는 과정으로, 주로 ID와 비밀번호를 사용해 사용자 신원을 확인합니다.

  2. 권한 부여(Authorization): 인증된 사용자가 특정 자원이나 기능에 접근할 수 있는지 결정하는 과정입니다. 예를 들어, ROLE_USER 권한을 가진 사용자만 특정 페이지에 접근할 수 있도록 제한합니다.

  3. 인증과 권한 정보를 담은 Authentication 객체: Spring Security는 Authentication 객체를 통해 인증된 사용자의 정보(사용자 이름, 권한 등)를 저장하고, 이 정보를 활용해 권한 부여를 수행합니다.

  4. SecurityContext와 SecurityContextHolder: SecurityContext는 인증된 사용자의 Authentication 정보를 담고 있으며, SecurityContextHolder를 통해 이를 관리하고 조회할 수 있습니다.

Spring Security의 주요 기능

  1. 폼 기반 로그인(Form-based Login): 기본적인 로그인 페이지와 로그인 처리를 제공하여 쉽게 로그인 기능을 추가할 수 있습니다.

  2. HTTP 기본 인증(Basic Authentication): HTTP 헤더에 Authorization 필드를 포함해 인증을 수행하는 방식으로, 주로 API 보안에 사용됩니다.

  3. OAuth2 및 OpenID Connect: 소셜 로그인(구글, 페이스북, 깃허브 등)과 같은 외부 인증 제공자와 연동하여 인증할 수 있습니다.

  4. CSRF 보호: Cross-Site Request Forgery(CSRF) 공격을 방지하기 위한 보호 기능이 기본으로 포함되어 있습니다.

  5. 세션 관리: 사용자 세션을 관리하여, 세션 고정 공격 방지와 동시에 하나의 사용자당 하나의 세션만 허용하는 등의 세션 제어 기능을 제공합니다.

Spring Security의 동작 과정

  1. 인증 요청 처리: 사용자가 애플리케이션에 로그인하려고 하면, Spring Security는 AuthenticationManager를 사용해 사용자 인증을 시도합니다.

    • 인증이 성공하면, Authentication 객체가 SecurityContext에 저장됩니다.
    • Authentication 객체는 SecurityContextHolder를 통해 전역적으로 접근할 수 있어, 현재 로그인한 사용자의 인증 상태를 어디서든 확인할 수 있습니다.
  2. 접근 제어: 사용자가 특정 자원에 접근할 때, Spring Security는 해당 사용자의 권한을 확인하여 접근이 허용되는지 결정합니다.

    • 예를 들어, /admin 페이지는 ROLE_ADMIN 권한을 가진 사용자만 접근할 수 있도록 제한할 수 있습니다.
  3. 필터 체인(Filter Chain): Spring Security는 일련의 보안 필터 체인을 통해 요청을 가로채어 인증과 권한 부여를 처리합니다. 각 필터는 특정한 보안 작업을 수행하며, 요청이 순차적으로 필터를 통과하면서 인증 및 권한 부여가 이루어집니다.

Spring Security 설정 예제

Spring Security는 코드와 설정 파일을 통해 보안 규칙을 설정할 수 있습니다. 아래는 SecurityFilterChain을 이용해 로그인, 접근 제어 등의 보안 규칙을 설정하는 예제입니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests(authorize -> authorize
                .antMatchers("/admin/**").hasRole("ADMIN") // /admin/**는 ADMIN 권한 필요
                .antMatchers("/user/**").hasRole("USER")   // /user/**는 USER 권한 필요
                .anyRequest().authenticated()               // 그 외 모든 요청은 인증 필요
            )
            .formLogin(formLogin -> formLogin
                .loginPage("/login")                        // 커스텀 로그인 페이지 경로
                .permitAll()
            )
            .logout(logout -> logout
                .logoutUrl("/logout")                       // 로그아웃 URL
                .permitAll()
            )
            .csrf().disable(); // 테스트 시 CSRF 비활성화 (실제 서비스에서는 활성화 권장)

        return http.build();
    }
}

코드 설명

  • authorizeRequests: 요청 경로에 따라 접근 권한을 설정합니다. /admin/** 경로는 ROLE_ADMIN 권한이 있어야 접근할 수 있도록 제한합니다.
  • formLogin: 커스텀 로그인 페이지를 설정하여 /login 경로에서 사용자 로그인을 처리합니다.
  • logout: /logout 경로에서 로그아웃을 수행하도록 설정합니다.
  • csrf().disable(): 테스트 용도로 CSRF 보호를 비활성화하였습니다. 실제 서비스에서는 CSRF 보호를 활성화해야 보안이 강화됩니다.

Spring Security의 주요 컴포넌트

  • Authentication: 현재 사용자의 인증 정보를 담고 있으며, 사용자 ID, 권한 목록, 인증 상태 등을 포함합니다.
  • AuthenticationManager: 인증 요청을 처리하는 주체로, AuthenticationProvider를 통해 인증을 수행합니다.
  • AuthenticationProvider: 사용자 인증을 위한 로직을 정의하는 인터페이스로, 여러 인증 방식(예: 기본 로그인, 소셜 로그인)을 지원합니다.
  • SecurityContextSecurityContextHolder: SecurityContext는 인증된 사용자 정보를 담고 있고, SecurityContextHolder는 이를 관리하는 도구로, 현재 인증 정보를 전역적으로 저장하고 접근할 수 있도록 합니다.

Spring Security의 장점

  1. 강력한 인증 및 권한 부여 기능: 다양한 인증 방식과 권한 부여 기능을 지원하여, 복잡한 보안 요구 사항을 쉽게 구현할 수 있습니다.
  2. 유연한 확장성: 커스텀 인증 제공자, 필터, 권한 관리 등의 기능을 추가하여 요구에 맞게 확장할 수 있습니다.
  3. 보안 표준 지원: CSRF 보호, CORS 지원, 암호화된 비밀번호 저장 등 최신 보안 표준을 준수합니다.
  4. 내장 필터 체인: 여러 보안 필터를 자동으로 구성하여 요청과 응답을 보호합니다.

Spring Security는 웹 애플리케이션의 보안을 강화할 수 있는 필수적인 도구로, 인증과 권한 부여를 쉽게 설정하고 확장할 수 있는 기능을 제공합니다. 설정 및 커스터마이징을 통해 다양한 보안 요구 사항에 맞는 강력한 보안 체계를 구현할 수 있습니다.

'Springboot > Springboot Security' 카테고리의 다른 글

Filter (FilterChain)  (0) 2024.10.31
Spring Security에서 중요한 인터페이스들  (0) 2024.10.30
스레드풀  (0) 2024.10.29
세션(Session)과 제이슨웹토큰(JSON Web Token)  (0) 2024.10.29
OAuth  (1) 2024.10.28

+ Recent posts