본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!
사용자의 인증 정보를 저장하는 토큰 개념.
2가지 용도로 사용된다. 인증 용도
또는 인증 후 세션에 담기 위한 용도
인증시 id와 password를 담고 인증 검증을 위해 전달되어 사용된다.
인증 후 최종 인증 결과(user 객체, 권한 정보)를 담고 SecurityContext에 저장되어 아래와 같은 코드로 전역적으로 참조가 가능하다.
Authentication authentication = SecurityContexHolder.getContext().getAuthentication()
Authentication은 인터페이스이므로 구현체가 따로 존재한다. 물론 사용자가 직접 커스텀도 가능하다. 대표적으로 UsernamepPasswordAuthenticationFilter
이 있다.
details
을 set할 때에 authenticationDetailsSource.buildDetails(request)
가 호출된다. 리턴타입은 WebAuthenticationDetails
객체이다.
기본적으로 remoteAddress, SessionId 등 인증 과정 중 전달된 데이터를 객체에 담게된다. 물론 extends 후 커스텀 가능하다.
protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
authRequest.setDetails(this.authenticationDetailsSource.buildDetails(request));
}
MODE_THREADLOCAL
: 스레드당 SecurityContext 객체를 할당, 기본값MODE_INHERITABLETHREADLOCAL
: 메인 스레드와 자식 스레드에 관하여 동일한 SecurityContext를 유지MODE_GLOBAL
: 응용 프로그램에서 단 하나의 SecurityContext를 저장한다.SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)
어차피 SecurityContext가 세션에 저장되기 때문에 세션->SecurityContext-> 인증객체를 찾아도 괜찮다.
@GetMapping()
public String index(HttpSession session){
Authentication authentication1 = SecurityContextHolder.getContext().getAuthentication()
SecurityContext context = (SecurityContext)session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
Authenticatino authentication2 = context.getAuthentication();
// authentication1 == authentication2 이다.
}
SecurityContext 객체의 생성, 저장, 조회하는 필터이다.
인프런 '스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security' (정수원)
안녕하세요! 글 잘 봤습니다. 덕분에 코드를 이해하는데 도움이 됬습니다. 혹시 어떤 자료를 통해 공부하셨는지 알수 있을 까요?