디지털 시대에 보안은 그 어느 때보다 중요해졌습니다.
애플리케이션과 데이터의 보호는 단순한 선택이 아니라 필수적인 요구 사항으로 자리 잡고 있습니다. 기업과 조직의 정보는 물론 개인 사용자의 데이터까지, 보안 침해는 막대한 재정적 손실과 신뢰도 하락을 초래할 수 있습니다.
이러한 상황에서 Spring Security는 강력한 보안 프레임워크로서의 역할을 하며, Java 기반 애플리케이션의 보안을 관리하는 데 필수적인 도구입니다.
Spring Security란❓
Spring Security는 Spring Framework의 일부로 제공되는 강력한 보안 프레임워크로, Java 애플리케이션에서 인증(Authentication)과 권한 부여(Authorization) 기능을 효율적으로 구현하고 관리할 수 있도록 돕는 도구입니다.
애플리케이션의 보안을 강화하고, 다양한 보안 요구 사항을 충족시키기 위해 설계되었습니다.
Spring Security는 '인증'과 '인가'에 대한 부분을 Filter 흐름에 따라 처리하고 있습니다.
Spring Security의 주요 기능
인증(Authentication)
- 인증은 사용자가 누구인지 확인하는 과정입니다.
- Spring Security는 기본적인 사용자 이름과 비밀번호 인증 외에도 OAuth2, OpenID Connect, LDAP 등 다양한 인증 방법을 지원합니다.
- 이를 통해 사용자의 신원을 검증하고, 안전한 접근을 보장할 수 있습니다.
권한 부여(Authorization)
- 권한 부여는 인증된 사용자가 애플리케이션 내에서 어떤 작업을 수행할 수 있는지를 결정하는 과정입니다.
- Spring Security는 URL 기반 접근 제어, 메서드 기반 접근 제어, 역할 기반 접근 제어 등 다양한 권한 부여 전략을 지원하여, 사용자의 권한을 세밀하게 조정할 수 있습니다.
CSRF(Cross-Site Request Forgery) 보호
- CSRF는 악의적인 사용자가 인증된 사용자의 권한을 이용해 불법적인 요청을 보내는 공격입니다.
- Spring Security는 기본적으로 CSRF 보호 기능을 제공하여, 이러한 공격으로부터 애플리케이션을 안전하게 보호합니다.
세션 관리
- Spring Security는 세션 관리를 통해 사용자의 세션을 안전하게 처리합니다.
- 세션 고정 공격 방지, 세션 타임아웃 설정, 다중 세션 관리 등 다양한 기능을 제공하여, 사용자의 세션을 안전하게 유지할 수 있습니다.
통합 및 확장성
- Spring Security는 Spring Boot와의 통합을 통해 쉽게 설정할 수 있으며, 다양한 보안 필터와 핸들러를 통해 보안 기능을 확장할 수 있습니다.
- 개발자는 필요에 따라 보안 설정을 커스터마이징하고, 애플리케이션의 요구 사항에 맞게 조정할 수 있습니다.
Spring Security - Filter Chain
Spring Security는 FilterChainProxy를 통해 필터 체인을 관리하고, 요청 처리 과정에서 다양한 보안 작업을 수행합니다.
- DispatcherServlet
- Spring MVC에서 모든 요청을 처리하며, 컨트롤러로 분배합니다.
- Filter
- DispatcherServlet 이전에 요청을 처리하는 공통 기능을 제공하며, 인증 및 인가와 같은 보안 관련 작업을 수행합니다.
- Spring Security는 이 필터 체인을 활용하여 보안을 적용합니다.
Spring Security의 인증 과정
1. 사용자가 로그인 정보를 제출하여 인증 요청을 합니다. 사용자가 로그인 폼에 사용자 이름과 비밀번호를 입력하고 제출하면, 이 요청은 HTTP 요청으로 애플리케이션 서버에 전달됩니다.
2. AuthenticationFilter가 요청을 가로채서 인증된 사용자의 정보가 담긴 Authentication 종류 중 하나인 UsernamePasswordAuthenticationToken의 인증용 객체(Token)를 생성합니다.
- UsernamePasswordAuthenticationFilter는 로그인 요청을 가로채고,
- UsernamePasswordAuthenticationToken 객체를 생성합니다. 이 객체는 사용자의 로그인 정보(사용자 이름과 비밀번호)를 포함하고 있습니다.
3. AuthenticationManager의 구현체인 ProviderManager에게 생성한 UsernamePasswordToken 객체를 전달하여 인증을 시도합니다.
4. AuthenticationManager는 등록된 AuthenticationProvider들을 조회하여 인증을 요구합니다.
5. 실제 DB에서 사용자 인증정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨줍니다.
6. 넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만듭니다.
7. AuthenticationProvider들은 UserDetails를 넘겨받고 사용자 정보를 비교합니다.
- 실패하면 SecurityContextHolder를 비웁니다.
- 성공하면 SecurityContextHolder에 Authentication를 세팅합니다.
8. 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환합니다.
9. 다시 최초의 AuthenticationFilter에 Authentication 객체가 반환됩니다.
10. Authentication 객체를 SecurityContext에 저장합니다.
11. SecurityContextHolder는 세션 영역에 있는 SecurityContext에 Authentication 객체를 저장합니다.
SecurityContextHolder❓
SecurityContextHolder는 Spring Security에서 보안 컨텍스트를 관리하는 중요한 클래스입니다.
이 클래스는 인증된 사용자와 관련된 보안 정보를 저장하고, 애플리케이션의 다양한 부분에서 접근할 수 있게 합니다.
이를 위해 ThreadLocal을 사용하여 각 스레드가 독립적인 SecurityContext를 가지도록 보장하며, 멀티스레딩 환경에서도 안전하고 일관된 보안 정보 처리를 제공합니다.
- SecurityContext
- 인증된 사용자의 정보를 저장하는 컨테이너입니다.
- SecurityContextHolder
- 현재 스레드와 관련된 SecurityContext를 관리합니다.
- 이 SecurityContextHolder 객체를 통해 인증된 사용자 정보에 접근할 수 있습니다.
- principal
- 현재 인증된 사용자를 나타냅니다.
- UsernamePasswordAuthenticationToken의 경우, 일반적으로 UserDetails 인스턴스입니다.
- credentials
- 사용자의 비밀번호를 포함할 수 있지만, 인증 후에는 대부분 비워집니다.
- authorities
- 사용자가 가진 권한을 GrantedAuthority 객체로 나타냅니다.
'Framework > Spring Security' 카테고리의 다른 글
[Spring Security] CSRF 토큰을 사용한 Spring Boot의 CSRF 공격 방어하기 (0) | 2024.08.20 |
---|---|
[Spring Security] 로그인 처리와 @AuthenticationPrincipal을 활용한 인증 구현 (0) | 2024.08.04 |