Spring Security란?
Spring 기반 웹이나 애플리케이션에서 보안과 인증을 담당하는 프레임워크이다.
Spring Security의 핵심적인 기능은 인증(Authentication)과 인가(Authorization)이다.
1. Spring Security 주요 구성요소
Security Configurations
Spring Security의 가장 중요한 구성 요소 중 하나로, 애플리케이션의 보안 설정을 정의한다. 어떤 요청을 받았을 때 해당 요청이 보호되어야 하는지, 사용자 인증 방법은 무엇인지, 사용자 권한은 어떻게 정의되는지 등을 설정하는 역할을 수행한다.
Authentication Manager
인증 프로세스를 관리하는데 사용되며, 인증 과정을 처리하기 위해 Authentication Provider를 사용한다.
파라미터로 받은 Authentication 객체가 유효한지 인증하고 리턴하여 최종적으로 Security Context에 담게된다.
Authentication Provider
실제로 인증 프로세스를 수행하는데 사용되며, 사용자 인증 정보를 제공한다. 예를 들어, 사용자 이름과 암호, OAuth 토큰, X.509 인증서 등을 제공할 수 있다.
UserDetailsService
유저의 정보를 불러오기 위해서 구현해야하는 인터페이스로 기본 오버라이드 메서드는 아래와 같다.
메소드 | 리턴 타입 | 설명 |
loadUserByUsername | UserDetails | 유저의 정보를 불러와서 UserDetails로 리턴 |
UserDetails
사용자의 정보를 불러오기 위해서 구현해야 하는 인터페이스로 기본 오버라이드 메서드들은 아래와 같다.
메소드 | 리턴 타입 | 설명 | 기본값 |
getAuthorities() | Collection<? extends GrantedAuthority> | 계정의 권한 목록을 리턴 | |
getPassword() | String | 계정의 비밀번호를 리턴 | |
getUsername() | String | 계정의 고유한 값을 리턴 ( ex : DB PK값, 중복이 없는 이메일 값 ) |
|
isAccountNonExpired() | boolean | 계정의 만료 여부 리턴 | true ( 만료 안됨 ) |
isAccountNonLocked() | boolean | 계정의 잠김 여부 리턴 | true ( 잠기지 않음 ) |
isCredentialsNonExpired() | boolean | 비밀번호 만료 여부 리턴 | true ( 만료 안됨 ) |
isEnabled() | boolean | 계정의 활성화 여부 리턴 | true ( 활성화 됨 ) |
SecurityContextHolder
Spring Security에서 현재 인증된 사용자의 인증 정보를 저장한다. ThreadLocal의 전략을 설정하여 달라지는 쓰레스에 따른 사용자 인증 정보의 가용성을 유지시키는 역할을 한다.
FilterChainProxy
DelegatingFilterProxy로부터 Filter 작동에 대한 요청을 위임받아 실제로 인증 처리를 하는 클래스이다. Spring Security를 사용하면 모든 요청은 FilterChainProxy 클래스를 거치게 되며, 내부에 getFilters() 메서드를 통해 SecurityFilterChain의 Filter 목록을 가져오게 된다.
Session Management
Spring Security에서 사용자 인증 및 권한 정보를 저장하는 방법으로 세션을 사용하는데 세션은 사용자가 로그인한 상태를 유지하고 인증 정보 및 권한 정보를 저장하는 역할을 한다. Spring Security에서는 HttpSession을 기반으로 세션 관리를 수행하는 것이 일반적이다.
2. Spring Security 작동원리
보안 필터 체인
Spring Security는 보안 필터 체인(Security Filter Chain)을 사용하여 요청을 보호하는데 여러 개의 보안 필터를 순서대로 실행하는 일종의 필터 파이프 라인이다. 각 보안 필터는 요청에 대한 인증, 권한 부여, 보안 검사 등을 수행하게된다.
인증
Spring Security는 인증(Authentication)을 통해 사용자가 누구인지 확인하는데 사용자는 로그인 페이지에 제공한 자격 증명(아이디와 패스워드)을 제출하여 인증을 수행하게 된다. 이 때 AuthenticationManger 클래스에서 사용자가 제공한 자격 증명을 검증하고, 인증된 사용자의 정보를 인증 객체(Authentication Object)에 저장한다.
권한 부여
Spring Security는 권한 부여(Authorization)를 통해 인증된 사용자가 허용된 작업을 수행할 수 있는지 확인한다. 사용자는 인증 후, 보호된 자원에 액세스하려고 시도하고 Spring Security는 사용자의 권한을 검사하여 해당 자원에 액세스할 수 도록하며, 허용되지 않은 사용자는 거부합니다.
3. Spring Security 작동 과정
먼저 로그인 페이지에서 사용자가 아이디 비밀번호를 Form을 통해 전송한다.
그럼 AuthenticationFilter에서 UsernamePasswordAuthenticationToken을 생성하여 AuthenticationManager에게 전달한다.
AuthenticationManager는 등록된 AuthenticationProvider(들)을 조회하여 인증을 요구한다.
AuthenticationProvider는 UserDetailsService를 통해 입력받은 아이디에 대한 사용자 정보를 DB에서 조회한다.
입력받은 비밀번호를 암호화(BCryptPasswordEncoder)하여 DB의 비밀번호와 매칭시켜 일치하는 경우 인증된UsernamePasswordAuthenticationToken을 생성하여 사용자 정보와 함께 Authentication 객체에 담겨 AuthenticationManager에 응답된다.
AuthenticationManager는 Authentication 객체를 AuthenticationFilter를 통해 SecurityContextHolder에 의해 관리되는 SecurityContext에 저장된다.
4. 참고: 헷갈리는 부분을 chatGPT에게 질문해보았다.
모르는 부분을 질문하였을 때 대략적인 흐름이나 내가 몰랐던 부분을 집어주는 역할을 톡톡히 하는 것 같다.
다만 제대로된 답변인지는 구글링과 관련문서를 통해 더 자세히 살펴볼 필요가 있다.
'개발지식 > BE(Back-End)' 카테고리의 다른 글
JAVA VO객체 깊은 복사하기 (1) | 2025.04.08 |
---|---|
RestAPI란? (0) | 2023.04.02 |
Spring Framework - Handler란? (0) | 2023.04.01 |
Spring Framework - Repository의 역할 (0) | 2023.04.01 |
Spring Framework - Controller와 RestController의 차이 (0) | 2023.04.01 |