@Async 사용 시 spring security 세션 정보 추출 주의사항

로그인 되어 있는 상태에서 다음의 메소드를 Async 방식으로 호출한 후 로그인 사용자의 계정 정보를 추출하면 항상 null 값이 나온다.

@Async

public void searchLog(Search search) {

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

String userId = auth.getName();

}


스프링 시큐리티는 사용자 인증 후 ThreadLocal 객체에 값을 저장하기 때문에 @Async 기능으로 인한 새로운 쓰레드에서는 사용자 세션 정보를 가져올 수 없다.

-> spring security 필터를 통과한 쓰레드만 사용자 로그인 정보를 ThreadLocal에 담는다.