Spring Security는 스프링 기반의 애플리케이션의 보안을 담당하는 프레임워크입니다. 개발자가 다양한 보안 위협 및 공격으로 부터 애플리케이션을 보호할 수 있게 포괄적인 보안 기능을 제공합니다. 주로 인증, 권한 부여, 액세스 제어 및 데이터 보호와 같은 기능을 제공합니다.
인증의 경우 사용자의 신원을 확인하는 과정이며, 인가은 특정 자원에 접근할 수 있는 권한을 부여하는 과정입니다.
Spring Security는 다음과 같은 구성 요소로 이루어져 있습니다.
사용자가 로그인 정보를 입력하고 서버에 전송
AuthenticationFilter가 로그인 정보를 가지고 Authentication 객체를 생성합니다.
AuthenticationManager가 AuthenticationProvider를 선택하여 인증 요청을 위임합니다.
AuthenticationProvider가 사용자 정보와 비밀번호 등을 검증하고, 성공하면 새로운 Authentication 객체를 반환합니다.
SecurityContext에 새로운 Authentication 객체를 저장합니다.
스프링 시큐리티의 인가 과정은 사용자가 특정 자원에 접근하였을 때 InterceptorFilter가 SecurityContext에서 Authentication 객체를 가져옵니다. AccessDecisionManager가 Authentication 객체의 권한과 자원의 접근 규칙을 비교하여 허용 여부를 결정합니다.
Spring Security를 사용해야 하는 대표적 이유는 유연성입니다. id/pw 기반 인증, 토큰 기반 인증, 생체 인식 인증 등의 다양한 인증 및 권한 부여 메커니즘을 지원하도록 쉽게 구성되어있습니다. 또한 웹 기반 애플리케이션을 보호하는데 사용되는 여러 보안 필터는 제공합니다. 액세스 제어 규칙을 적용하고 XSS, SQL Injection 등을 보안 필터를 사용하여 방지할 수 있습니다.
즉, 서비스 또는 서비스를 사용하는 유저들의 정보와 같은 리소스를 보호하기 위한 보안 정책이며 유연하게 구현이 가능해 사용합니다.
많은 기능을 제공하는 만큼 설정이 복잡하고 커스터마이징이 어려울 수 있으며 다음과 같은 문제점이 발생할 수 있습니다.
js, css폴더를 허용해 주지 않는 경우 로그인 후에 원하는 url로 이동하지 않고 css, image 파일로 이동할 수 도 있습니다.
내부적으로 사용되는 url들은 확장자가 없기 때문에 확장자로 패턴을 주는 경우 로그인하지 못하는 문제가 발생할 수 있습니다.
Spring Framework와 Spring Security의 버전이 다르면 오류가 발생할 수 있습니다.
AuthorizationRequest를 사용하면 HttpSession이 null이 되어 Csrf Filter에서 오류가 발생할 수 있습니다.