Spring Security
스프링 시큐리티에 대해 알아볼 페이지

Spring Security
어플리케이션 개발에 있어서 보안은 굉장히 중요한 문제입니다. 보안과 관련된 기능들은 데이터 암호화, 사용자 인증 , 권한 부여, 웹 공격 방어 등 다양하죠.
이러한 기능들은 어플리케이션 개발에 필수로 필요한 부분들이면서 개발하기 위해서는 상당한 노력이 필요 합니다.
하지만 걱장할 것 없습니다. 이러한 기능들을 이미 표준화된 방식으로 통합 제공해 주는 스프링 시큐리티모듈을 사용하면 어플리케이션에 즉시 보안기능을 적용할 수 있습니다.
Spring Security가 제공하는 보안기능들
사용자 인증기능
권한 체크기능
데이터 암호화 기능
세션 관리기능
CSRF등 웹공격 방어 기능
...
Spring Security의 핵심 개념
1. Authentication (인증)
"누구인가?"를 확인하는 절차
인증방법
아이디/비밀번호기반 로그인
토큰 기반 인증(소셜로그인시 사용)
위 인증방법을 통해 인증에 성공하면 Authentication객체가 생성되며,SecurityContext에 인증정보가 저장된다.
2. Authorization (인가)
"무엇을 할 수 있는가?"를 확인하는 절차
사용자의 역할(Role)과 권한(Authority)을 기반으로 접근할 수 있는 URL을 제어하기 위해 사용한다
EX) / ADMIN 으로 시작하는 URL은
ADIMN권한을 가진 사용자만 이용가능하게 제어 가능
3. SecurityContext
인증에 성공한 사용자 정보를 보관하는 컨텍스트
인증(Authentication)이후 생성된 사용자 정보를 보관한다.
인증 성공 후 SecuirtyContext는 Session에 저장된다.
사용자의 요청이 들어올 때 마다 SecurityContext는 Session에서 꺼내진 후 , SecurityContextHolder에 저장된다.(접근용이성)
요청이 들어온 스레드 에 저장되어 요청 처리 중 어디서든 접근하여 사용할 수 있다.
ex) 인증정보에 접근
4. Filter Chain
스프링 시큐리티의 요청 처리 핵심 메커니즘(모든 요청은 보안기능은 필터를 기반으로 이루어짐)
스프링 시큐리티는 여러 개의 보안 필터를 체인으로 연결하여 사용자의 모든 요청을 가로채고 필요한 보안 처리를 수행한다.
사용자의 요청이 DispatcherServlet으로 전달 되기 전 가로챈다
각 보안 필터는 인증,인가,csrf방어 등의 기능을 순차적으로 적용한다.
Spring Security의 Filter Chain 동작 흐름 😵
SecurityContextPersistenceFilter
Spring Security의 시작 역할의 Chain
요청이 들어오면 세션에 저장된 SecurityContext를 읽어 SecurityContextHolder에 저장하는 필터
요청 처리 후 인증 정보를 다시 세션에 저장하여 "인증"상태를 유지시켜 주는 시큐리티의 핵심 필터
LogoutFilter
유저의 Logout요청이 들어오는 경우 로그아웃을 수행하는 필터
세션을 무효화하고 SecurityContext를 초기화 한다.
실행 완료 후 LogoutSuccessFulHandelr를 호출하여 메인페이지로 리다이렉트 한다.
UsernamepasswordAuthenticationFilter
Form기반 로그인 증과정을 진행하는 필터
AuthenticationManager에게 인증 작업을 위임한다.
인증 성공 시 AuthenticationSuccessHandelr호출하여 성공페이지로 이동
DefaultLoginPageGeneratingFilter
사용자가 로그인 페이지를 구현하지 않은 경우 스프링에서 설정한 로그인 페이지를 생성하는 필터.
BasicAuthenticationFilter
Http요청의 인증 헤더를 처리하여 SecurityContextHolder에 저장하는 필터
RestApi개발 시 인증에 사용한다.
SecurityContextHolderAwareRequestFilter
HttpServletRequest에 보안기능을 추가로 씌워주는 필터.
컨트롤러의 request에 보안 메서드(getUserPrincipal())를 사용할 수 있게 해준다.
RememberMeAuthenticationFilter
사용자가 로그인 유지(Remember-me)체크박스를 선택한 경우 자동 로그인 처리 해주는 기능.
AnonymousAuthenticationFilter
SecurityContextHolder에 인증객체가 있는지 확인 후 없을 경우, 익명 사용자 토큰을 생성하는 필터.
현재 요청이 익명사용자로부터 들어온 요청인지/ 인증된 사용자로부터 들어오는 요청인지를 구분할 수 있게된다.
SessionManagementFilter
인증이 완료되면, 세션정책(동시 로그인 제한, 세션보호)을 적용하는 필터
ExceptionTranslationFilter
필터 체인 내 발생하는 모든 예외를 처리하는 필터
FilterSecurityInterceptor
최종 인가 검사를 수행하는 필터
사용자가 특정 URL, 메서드를 이용할 수 있는지 확인한다.
UsernamePasswordAuthenticationFilter 인증 과정
UsernamePasswordAuthenticationFilter기준.

사용자가 로그인 폼을 제출(reqeust)하는 경우 이 요청을 UsernamePasswordAuthenticationFilter가 가로챕니다.
AuthenticationFilter는 사용자의 요청내용에 담긴 username/password값을 꺼낸 후 UsernamePasswordAuthenticationToken에 담습니다.
AuthenticationFilter는 실제 인증 작업을 AuthenticationManager에게 위임
authenticate()메서드 호출
AuthenticationManager는 AuthenticationProvider들 중 하나를 선택하여 인증작업을 수행
AuthenticationProvider가 UserDetailsService에 사용자 정보 요청
loadUserByUsername()메서드 호출.
사용자는 loadUserByUsername을 오버라이딩하여 db에서 사용자 정보를 조회하도록 구현
UserDetailsService의 메서드 호출 결과로 UserDetails객체를 반환
UserDetails객체에는 사용자의 아이디, 비밀번호, 권한, 기타정보가 포함되어 있다.
AuthenticationProvider가 비밀번호 검사
UserDetails에 포함된 사용자의 비밀번호와 토큰에 담긴 비밀번호를 비교하여 인증을 수행
일치하면 인증 성공, 아니면 인증 실패.
인증 실패시 BadCredentialsException예외가 발생하며 AuthentionFailureHandler에 예외 전달
인증 성공시 Authentication객체 생성
UsernamePasswordAuthenticationToken을 새로 생성하여 반환
생성된 토큰에는 UserDetails가 포함
AuthenticationManager가 인증 결과 반환
Authentication객체를 AuthenticationFilter에 반환
SecurityContextHolder에 인증 정보 저장
Last updated
