스프링 보안(Spring Security)은 자바 기반의 웹 애플리케이션 및 서비스에서 보안을 구현하는 데 사용되는 강력한 프레임워크입니다. 스프링 보안은 애플리케이션의 인증(Authentication)과 권한 부여(Authorization)를 관리하여 사용자 및 자원의 보안을 보장합니다. 이를 통해 애플리케이션의 보안 측면을 강화하고 민감한 데이터 및 작업을 안전하게 보호할 수 있습니다.
### 인증(Authentication)
인증은 사용자가 시스템에 대한 자신의 신원을 증명하는 과정을 말합니다. 스프링 보안은 다양한 방법을 통해 사용자를 인증할 수 있습니다. 일반적으로 사용되는 방법은 다음과 같습니다.
1. 폼 기반 인증(Form-based Authentication): 사용자가 아이디와 패스워드를 입력하여 로그인하는 방식입니다. 스프링 보안은 사용자가 제출한 자격 증명을 검사하여 인증을 수행합니다.
2. HTTP 기본 인증(HTTP Basic Authentication): 사용자가 요청을 보낼 때 인증 헤더에 아이디와 패스워드를 담아 요청을 보내는 방식입니다. 스프링 보안은 이를 이용하여 사용자를 인증합니다.
3. 토큰 기반 인증(Token-based Authentication): 사용자가 로그인하면 서버에서 토큰을 발급하여 클라이언트에 전달하고, 이후 요청에는 해당 토큰을 함께 전송하여 인증을 수행하는 방식입니다.
### 권한 부여(Authorization)
권한 부여는 인증된 사용자에 대해 특정 자원 또는 기능에 대한 접근 권한을 부여하는 과정을 말합니다. 스프링 보안은 다양한 방법을 통해 권한을 부여할 수 있습니다. 주요한 방법은 다음과 같습니다.
1. URL 기반 접근 제어(URL-based Access Control): 특정 URL에 대한 접근 권한을 설정하여 인가된 사용자만 해당 자원에 접근할 수 있도록 제어할 수 있습니다.
2. 메소드 기반 접근 제어(Method-based Access Control): 특정 메소드에 대한 접근 권한을 설정하여 해당 메소드를 호출할 때 인가된 사용자만 호출할 수 있도록 제어할 수 있습니다.
3. 표현식 기반 접근 제어(Expression-based Access Control): SpEL(Spring Expression Language)을 사용하여 더 복잡한 권한 부여 규칙을 정의할 수 있습니다.
### 스프링 보안 설정
스프링 보안을 적용하기 위해서는 설정 파일에 보안 관련 빈을 정의해야 합니다. 주요한 보안 빈으로는 `WebSecurityConfigurerAdapter` 클래스를 상속한 설정 클래스를 정의하고, `configure` 메소드를 오버라이딩하여 보안 설정을 구성하는 것이 있습니다. 또한 `@EnableWebSecurity` 애노테이션을 사용하여 웹 보안을 활성화할 수 있습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("admin").password("{noop}admin").roles("ADMIN")
.and()
.withUser("user").password("{noop}user").roles("USER");
}
}
위의 예시에서는 `/admin/
` 경로는 `ADMIN` 권한을 가진 사용자만 접근할 수 있고, `/user/` 경로는 `USER` 권한을 가진 사용자만 접근할 수 있도록 설정되어 있습니다. 또한 각 사용자의 아이디와 패스워드, 그리고 역할(role)을 메모리에 저장하여 인증을 수행합니다.
### 스프링 보안 필터
스프링 보안은 여러 개의 필터를 사용하여 보안을 적용합니다. 주요한 필터로는 `UsernamePasswordAuthenticationFilter`와 `BasicAuthenticationFilter`가 있습니다. `UsernamePasswordAuthenticationFilter`는 폼 기반 인증을 처리하고, `BasicAuthenticationFilter`는 HTTP 기본 인증을 처리합니다. 이러한 필터들은 보안 설정에 따라 적절히 조합하여 사용자의 요청을 인증하고 권한을 확인합니다.
### 스프링 보안과 RESTful API
스프링 보안은 RESTful API에도 적용할 수 있습니다. RESTful API를 보호하기 위해서는 토큰 기반 인증과 같은 방법을 사용하여 사용자를 인증하고 권한을 부여할 수 있습니다. 또한 `@PreAuthorize`와 `@PostAuthorize` 애노테이션을 사용하여 메소드 수준에서 권한을 확인할 수도 있습니다.
<pre class="wp-block-syntaxhighlighter-code">
@RestController
public class UserController {