학습
Java Spring Security의 기초
Java Spring Security의 기초 — 고급
Spring Security의 기초
1. 도입 (왜 배워야 하는가)
Spring Security는 자바 기반의 웹 애플리케이션에서 인증(Authentication)과 인가(Authorization)를 처리하는 강력한 프레임워크입니다. 이 기술을 배우는 이유는, 현대의 웹 애플리케이션에서 보안은 필수적이며, 사용자 데이터 보호와 시스템 무결성을 유지하기 위해서는 적절한 보안 조치가 필요하기 때문입니다.
만약 Spring Security를 모른다면, 다음과 같은 문제가 발생할 수 있습니다:
- 사용자 정보가 유출될 위험이 커집니다.
- 악의적인 사용자가 시스템에 접근하여 데이터를 변경하거나 삭제할 수 있습니다.
- 보안 취약점을 악용하는 공격에 노출될 수 있습니다.
- 인증(Authentication): 사용자가 누구인지 확인하는 과정입니다. 예를 들어, 은행에 가서 신분증을 보여주는 것과 같습니다.
- 인가(Authorization): 인증된 사용자가 어떤 자원에 접근할 수 있는지를 결정하는 과정입니다. 마치 집 열쇠를 가지고 있지만, 특정 방은 열 수 없는 것과 같습니다.
- 보안 필터 체인(Security Filter Chain): 요청이 들어올 때마다 실행되는 필터의 연속입니다. 요청을 처리하기 전에 보안 검사를 수행합니다.
- 웹 애플리케이션에 접근할 때 로그인 페이지가 표시됩니다.
@Configuration: 이 클래스가 Spring의 설정 파일임을 나타냄.@EnableWebSecurity: Spring Security의 설정을 활성화.protected void configure(HttpSecurity http): HTTP 요청에 대한 보안 설정을 정의하는 메서드.http.authorizeRequests(): 요청에 대한 접근 제어를 설정.anyRequest().authenticated(): 모든 요청은 인증이 필요하다고 설정.and().formLogin(): 기본 로그인 폼을 사용하도록 설정.- CSRF 보호 비활성화 시 주의:
csrf().disable()을 사용하면 CSRF 공격에 노출될 수 있으므로, 꼭 필요한 경우에만 비활성화해야 합니다. - 권한 체크 미비: 특정 경로에 대한 인가를 잘못 설정하면 보안이 취약해질 수 있습니다.
- Spring Security는 웹 애플리케이션의 보안을 강화하는 필수 프레임워크입니다.
- 인증과 인가는 사용자 보호를 위한 두 가지 핵심 요소입니다.
- 보안 필터 체인을 통해 요청에 대한 보안 검사를 수행합니다.
- Spring Security와 JWT 통합
- OAuth2를 이용한 소셜 로그인 구현
- Spring Security의 커스터마이징 방법
2. 핵심 개념 설명
| 용어 | 설명 |
|---|---|
| 인증 | 사용자의 신원을 확인하는 과정 |
| 인가 | 인증된 사용자의 접근 권한을 확인하는 과정 |
| 필터 | 요청과 응답을 가로막아 보안을 적용하는 컴포넌트 |
3. 기본 코드 예제
Spring Security를 설정하기 위한 가장 기본적인 코드 예제를 살펴보겠습니다.
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated() // 모든 요청은 인증 필요
.and()
.formLogin(); // 기본 로그인 페이지 사용
}
}
실행 결과
코드 한 줄씩 동작 설명
4. 실전 활용 예제
예제 1: 특정 경로에 대한 접근 제한
쇼핑몰 웹 애플리케이션에서 관리자 페이지는 일반 사용자에게 접근할 수 없어야 합니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // /admin 경로는 관리자만 접근
.anyRequest().authenticated()
.and()
.formLogin();
}
예제 2: JWT를 이용한 인증
모바일 앱과의 통신에 JWT를 활용하여 인증을 처리할 수 있습니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable() // CSRF 보호 비활성화
.authorizeRequests()
.antMatchers("/api/public/**").permitAll() // 공개 API
.anyRequest().authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 상태 비저장
}
5. 흔한 실수와 주의사항
- 잘못된 코드:
http.csrf().disable(); // 모든 요청에 대해 CSRF 보호를 비활성화
- 올바른 코드:
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); // CSRF 보호 유지
- 잘못된 코드:
.antMatchers("/admin/**").permitAll(); // 모든 사용자에게 관리자 접근 허용
- 올바른 코드:
.antMatchers("/admin/**").hasRole("ADMIN"); // 관리자만 접근 허용
6. 정리
다음에 학습하면 좋은 주제: