스프링 시큐리티는 스프링 기반의 애플리케이션 보안을 담당하는 스프링의 하위 프레임워크다. 보안(인증, 인가, 권한)에 대한 많은 옵션을 제공하며 애너테이션으로 설정하기도 간편하다는 장점이 있다.
CSRF 공격(사용자 권한을 갖고 특정 동작을 유도), 세션 고정 공격(사용자 인증 정보 탈취 및 변조)을 방어할 수 있고 요청 헤더 또한 보안 처리를 해주기 때문에 개발자가 프로젝트 진행 시 보안에 대한 부담감을 줄이는데 크게 기여한다.
💡 인증, 인가
사용자의 신원을 입증하는 즉 로그인 과정을 인증이라고 하면 인가는 사이트의 관리자 페이지처럼 특정 권한을 확인하는 과정을 말한다.
STS에서 스프링 시큐리티를 사용하기 위해 프로젝트 생성시 Spring Security를 추가하거나 이미 작업 중이던 프로젝트라면 프로젝트 폴더 마우스 우클릭>Srping>Add Staters를 눌러서 Spring Security를 추가하도록 한다.
추가하면 pom.xml에서 위 사진의 해당 코드를 확인할 수 있고, JRE System Library를 확인해도 시큐리티 관련 자료 파일들이 들어가 있는 것을 확인할 수 있다.
SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다. SecurityContext에는 접근 주체와 인증에 대한 정보를 담고 있다.
설정해둔 로그아웃 url에 요청을 확인하고 사용자를 로그아웃 처리하는 역할을 한다.
인증 관리자로 폼 기반 로그인을 사용할 때 사용되는 필터다. 필터로 아이디, 패스워드 데이터를 파싱하여 인증 요청을 위임하고 인증 성공 여부에 따라서 핸들러를 실행한다.
개발자가 로그인 페이지를 따로 지정하지 않았을 때 기본적으로 설정하는 로그인 페이지에 관련된 필터이다. 스프링에서 로그인 페이지를 제공하므로 별도의 로그인 페이지를 만들지 않았다면 기본 로그인 페이지를 이용할 수 있다.
요청 헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임하는 필터다. 인증에 성공 여부에 따라 핸들러를 실행한다.
로그인(인증)이 성공하면 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청을 처리해주는 필터다. 로그인하지 않은 상태에서 방문했던 마지막 페이지를 기억해두었다가 로그인에 성공하면 해당 페이지로 이동시켜주는 등의 처리를 할 수 있다.
HttpServletRequest 정보를 감싸고 있는 필터로 필터 체인 상의 다음 필터들에게 부가적인 정보를 제공하기 위해서 사용한다.
필터가 호출되는 시점까지 인증이 되지 않았을 때 익명 사용자 객체(AnonymousAuthentication)를 만들어서 SecurityContext에 넣어주기 위해 사용되는 필터다.
인증된 사용자와 관련된 세션 작업을 실행할 때 사용하는 필터로 세션 변조 방지 전략에 대한 설정과 유효하지 않은 세션에 대한 처리, 세션 생성 전략을 세우는 등의 작업을 수행한다.
요청 처리 중 발생하는 Exception을 위임하거나 전달하는 필터다.
접근 결정 관리자 필터로 AccessDecisionManager애개 권한 부여 처리를 위임하여 접근 제어 결정을 쉽게 할 수 있도록 도와준다. 이미 사용자가 인증되어 있는 상태에서 사용하기 때문에 유효한 사용자인지 권한에 대한 확인을 한다.
스프링 시큐리티는 필터 기반으로 동작한다. 각 필터에서 인증, 인가와 관련된 작업들을 처리한다. 특정 필터를 제거 하거나 필터 뒤에 다른 필터를 넣는 설정도 가능하다.
스프링 시큐리티의 동작 과정은 위와 같다.
참고
Spring Security야! 일단 이론만 정리해보자고! -girgir 벨로그
서적 : 스프링 부트 3 백엔드 개발자 되기(자바 편)