걸음마부터 달리기
[24/11/14] 시큐리티 SecurityContextHolder, SecurityContext , SecurityContextHolderFilter 흐름 본문
[24/11/14] 시큐리티 SecurityContextHolder, SecurityContext , SecurityContextHolderFilter 흐름
성추 2024. 11. 14. 21:40일단 첫 스텝에서는 Access 토큰만 발급하는걸로 구현을 진행해보았다.
Access 토큰이 탈취 당했을때를 대비하여 만료 시간을 짧게 잡고 Access 토큰이 만료되면 Refresh 토큰으로 재발급 받는 과정으로 가야하는데 그건 다음 스텝때...
https://bestdevelop-lab.tistory.com/82
https://itvillage.tistory.com/60
https://velog.io/@dbfla0628/Spring-Security-3.-SecurityContextHolderFilter
SecurityContextHolder는 쓰레드로컬 방식으로 같은 스레드에서는 공유함.
1) SecurityContextHolderFilter에서 현재 들어온 request와 관련하여 이전에 저장한 SecurityContext를 찾음.
이것은 SecurityContextRepository를 통하여 하나의 세션에서 공유되는 HttpSession을 통해 HttpSession에 저장되어 있는 SecurityContext를 찾아보고
2-1-1) 없다면 일단 권한 없는 빈 SecurityContext를 만들어서 SecurityContextHolder에 설정한다.
2-1-2) doFilter()로 다음필터로 감
2-1-3) 필터 쭉쭉 가다가 이제 Authentication 관련 필터인 AuthenticationFilter가 나오면 해당 필터에서 인증과정을 거친 후 SecurityContext에 Authentication 객체를 만들어서 주입함.
2-1-4) 이제 다음 request땐 이 SecurityContext와 Authentication 객체를 바로 가져다 쓰기 위해서 SecurityContextRepository를 통해 HttpSession에 저장
2-1-5) 이후 다음 필터 쭉쭉 가다가 AuthorizationFilter에서 SecurityContextHolder의 현재 SecurityContext를 조회하고, 그 안에 있는 Authentication 객체를 확인한다. 그 Authentication 객체 안에 있는 GrantedAuthority를 가져와서 체인에 걸려있던 요청된 URL과 메서드에 대한 접근 권한을 정의한 설정(예: hasRole, permitAll, 등)을 확인한다.
2-1-6-1) 만약 여기서 이제 인가의 문제(사용자 인증은 됐는데 권한이 부족할때) 가 생기면
AccessDeniedException 예외가 터져 ExceptionTranslationFilter가 AccessDeniedHandler를 호출
인증 자체가 안됐거나 인증의 문제가 생기면
AutheticationException 예외가 터져 ExceptionTranslationFilter가 AuthenticationEntryPoint에게 위임.
2-1-6-2) 제대로 인증/인가 되었을시 이제 드디어 디스패처 서블릿을 통해 스프링으로 진입한다.
2-1-2) HttpSession에 저장되어 있는 SecurityContext이 있으니까 그대로 SecurityContextHolder에 SecurityContext 주입하고 바로 다음 필터로 넘기면 그 이후는 2-1-5) 와 동일.
이후 스프링쪽에서 전부 할일 다 하고 리턴되면서 필터의 return문까지 오게 된다.
이후에는 필터의 역순서로 하나씩 return 되면서 SecurityContextHolderFilter에서 request때 SecurityContextHolder에 넣었던 SecurityContext를 제거하고 리턴되면서 Response로 나간다.
이렇게 없애놔야 다음 요청때 똑같은 과정을 거칠 수 있다.
결국엔 커스텀 필터(Custom Authentication Filter) 를 쓸거면
Authentication과 SecurityContext를 Holder에 넣는것뿐만 아니라 세션을 쓴다면 세션까지 넣어야한다.