Spring Security는 스프링 프레임워크 기반의 인증과 권한 부여(Authentication & Authorization)를 담당하는 보안 프레임워크입니다. 웹 애플리케이션과 REST API에서 보안을 강화하기 위해 사용
주요 기능
- 인증(Authentication)
- 사용자가 누구인지 확인하는 과정
- 예: 로그인 처리
- 권한 부여(Authorization)
- 인증된 사용자가 특정 리소스에 접근할 수 있는 권한이 있는지 확인
- 예: 관리자 페이지 접근 제한
- 보안 공격 방어
- CSRF(Cross-Site Request Forgery) 방어
- 세션 고정 공격 방어
- XSS(Cross-Site Scripting) 방어
- 클릭재킹 방어
- 다양한 인증 방식 지원
- 기본 폼 로그인
- HTTP Basic Auth
- OAuth2/OpenID Connect
- JWT(Json Web Token) 기반 인증
Spring Security 동작 방식
- 사용자가 로그인 요청
- UsernamePasswordAuthenticationFilter가 요청 처리
- 사용자 정보를 AuthenticationManager에 전달하여 인증 시도
- 인증 성공 시 SecurityContext에 사용자 정보 저장
- 이후 모든 요청은 SecurityContext를 통해 인증 정보 활용
간단한 구성 예제
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.antMatchers("/", "/public").permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
@Override
protected UserDetailsService userDetailsService() {
User.UserBuilder users = User.withDefaultPasswordEncoder();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(users.username("user").password("password").roles("USER").build());
manager.createUser(users.username("admin").password("admin").roles("ADMIN").build());
return manager;
}
}
설명
- /admin/** 경로는 ADMIN 권한만 접근 가능
- /user/** 경로는 USER 또는 ADMIN 권한으로 접근 가능
- / 및 /public 경로는 모두 허용
- 기본 로그인 폼 제공
확장 개념
- JWT 기반 인증: REST API에서는 세션 대신 JWT로 인증 정보를 전달
- OAuth2 인증: 소셜 로그인 (Google, Facebook) 연동
- 커스텀 필터: 사용자 정의 인증 로직 적용
Spring Security 아키텍처 개요
Spring Security는 다양한 컴포넌트와 레이어로 구성되어 있으며, 이를 통해 인증(Authentication) 및 **권한 부여(Authorization)**를 처리합니다. 아래는 주요 구성 요소와 그 역할입니다.
Spring Security 주요 구성 요소
1. Security Filter Chain
- 구성: 여러 보안 필터(예: UsernamePasswordAuthenticationFilter)로 이루어진 체인
- 동작: HTTP 요청이 필터 체인을 통과하면서 인증 및 권한 부여를 수행
- 핵심 클래스: DelegatingFilterProxy
주요 필터
- SecurityContextPersistenceFilter: 요청마다 SecurityContext 관리
- UsernamePasswordAuthenticationFilter: 폼 기반 로그인 처리
- ExceptionTranslationFilter: 인증 또는 권한 오류 처리
- FilterSecurityInterceptor: 최종 접근 제어 결정
2. Security Context
- 인증된 사용자의 보안 컨텍스트를 저장
- SecurityContextHolder를 통해 접근 가능
java
복사편집
SecurityContext context = SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication();
3. AuthenticationManager
- 역할: 인증 요청을 처리하여 사용자 인증 정보를 반환
- 주요 메서드: authenticate(Authentication authentication)
구현체
- ProviderManager: 여러 AuthenticationProvider를 관리
4. AuthenticationProvider
- 역할: 특정 인증 방식 처리
- 예: DaoAuthenticationProvider는 데이터베이스 기반 인증
5. UserDetailsService
- 역할: 사용자 정보를 로드하는 인터페이스
- 커스터마이징: DB 연동 시 재정의 필요
java
복사편집
@Service public class CustomUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 사용자 정보 조회 로직 return new User(username, password, authorities); } }
6. GrantedAuthority
- 역할: 사용자의 권한을 나타냄
- 예: ROLE_USER, ROLE_ADMIN
7. AccessDecisionManager
- 역할: 요청에 대해 허용 또는 거부 결정
- 구성 요소: AccessDecisionVoter 목록으로 결정
동작 흐름
- 요청(Request) 진입
- 사용자의 HTTP 요청이 필터 체인으로 전달
- 인증(Authentication)
- AuthenticationManager가 사용자 인증 처리
- 보안 컨텍스트 저장
- SecurityContextHolder에 인증 정보 저장
- 권한 부여(Authorization)
- AccessDecisionManager가 권한 확인
- 요청 처리 후 응답
Spring Security 아키텍처 다이어그램
rust
복사편집
Client -> Security Filter Chain -> AuthenticationManager -> AuthenticationProvider -> UserDetailsService -> Database/User Store -> SecurityContextHolder
커스터마이징 포인트
- 커스텀 UserDetailsService: 사용자 정보 조회 로직
- AuthenticationProvider: 커스텀 인증 처리
- Security Filter 추가: JWT 토큰 인증 등
- AccessDecisionVoter: 권한 체크 로직 커스터마이징
'Spring' 카테고리의 다른 글
Spring Swagger (0) | 2025.02.10 |
---|---|
WebSocket 예제 (0) | 2024.12.05 |
WebSocket (0) | 2024.12.05 |
Controller 와 Restcontroller (0) | 2024.11.28 |
Spring - AutoWired (0) | 2024.11.27 |