Spring Security는 Spring 프레임워크에 통합된 강력한 인증(Authentication)과 권한 부여(Authorization)를 제공하는 보안 프레임워크입니다. 웹 애플리케이션이나 API에서 사용자 인증과 접근 제어를 쉽게 구현하고 보안 수준을 높일 수 있도록 다양한 기능과 설정을 제공합니다.
Spring Security의 주요 개념
인증(Authentication): 사용자가 누구인지 확인하는 과정으로, 주로 ID와 비밀번호를 사용해 사용자 신원을 확인합니다.
권한 부여(Authorization): 인증된 사용자가 특정 자원이나 기능에 접근할 수 있는지 결정하는 과정입니다. 예를 들어,
ROLE_USER
권한을 가진 사용자만 특정 페이지에 접근할 수 있도록 제한합니다.인증과 권한 정보를 담은
Authentication
객체: Spring Security는Authentication
객체를 통해 인증된 사용자의 정보(사용자 이름, 권한 등)를 저장하고, 이 정보를 활용해 권한 부여를 수행합니다.SecurityContext와 SecurityContextHolder:
SecurityContext
는 인증된 사용자의Authentication
정보를 담고 있으며,SecurityContextHolder
를 통해 이를 관리하고 조회할 수 있습니다.
Spring Security의 주요 기능
폼 기반 로그인(Form-based Login): 기본적인 로그인 페이지와 로그인 처리를 제공하여 쉽게 로그인 기능을 추가할 수 있습니다.
HTTP 기본 인증(Basic Authentication): HTTP 헤더에
Authorization
필드를 포함해 인증을 수행하는 방식으로, 주로 API 보안에 사용됩니다.OAuth2 및 OpenID Connect: 소셜 로그인(구글, 페이스북, 깃허브 등)과 같은 외부 인증 제공자와 연동하여 인증할 수 있습니다.
CSRF 보호: Cross-Site Request Forgery(CSRF) 공격을 방지하기 위한 보호 기능이 기본으로 포함되어 있습니다.
세션 관리: 사용자 세션을 관리하여, 세션 고정 공격 방지와 동시에 하나의 사용자당 하나의 세션만 허용하는 등의 세션 제어 기능을 제공합니다.
Spring Security의 동작 과정
인증 요청 처리: 사용자가 애플리케이션에 로그인하려고 하면, Spring Security는
AuthenticationManager
를 사용해 사용자 인증을 시도합니다.- 인증이 성공하면,
Authentication
객체가SecurityContext
에 저장됩니다. Authentication
객체는SecurityContextHolder
를 통해 전역적으로 접근할 수 있어, 현재 로그인한 사용자의 인증 상태를 어디서든 확인할 수 있습니다.
- 인증이 성공하면,
접근 제어: 사용자가 특정 자원에 접근할 때, Spring Security는 해당 사용자의 권한을 확인하여 접근이 허용되는지 결정합니다.
- 예를 들어,
/admin
페이지는ROLE_ADMIN
권한을 가진 사용자만 접근할 수 있도록 제한할 수 있습니다.
- 예를 들어,
필터 체인(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
: 사용자 인증을 위한 로직을 정의하는 인터페이스로, 여러 인증 방식(예: 기본 로그인, 소셜 로그인)을 지원합니다.SecurityContext
와SecurityContextHolder
:SecurityContext
는 인증된 사용자 정보를 담고 있고,SecurityContextHolder
는 이를 관리하는 도구로, 현재 인증 정보를 전역적으로 저장하고 접근할 수 있도록 합니다.
Spring Security의 장점
- 강력한 인증 및 권한 부여 기능: 다양한 인증 방식과 권한 부여 기능을 지원하여, 복잡한 보안 요구 사항을 쉽게 구현할 수 있습니다.
- 유연한 확장성: 커스텀 인증 제공자, 필터, 권한 관리 등의 기능을 추가하여 요구에 맞게 확장할 수 있습니다.
- 보안 표준 지원: CSRF 보호, CORS 지원, 암호화된 비밀번호 저장 등 최신 보안 표준을 준수합니다.
- 내장 필터 체인: 여러 보안 필터를 자동으로 구성하여 요청과 응답을 보호합니다.
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 |