인증 처리간, 사용자 조회는 VxUserDetailProvider 인터페이스를 구현체에서 DBMS 등을 Access하여 조회하는 로직을 구현하게 된다.

사용자 조회는 Security 라이브러리를 사용하여 세션으로 조회할 경우는 이미 세션에 정보가 존재하는 상태이므로 이미 조회된 사용자가 있다면 아래와 같이 return하여 재조회를 막을 수 있다.

class CustomUserDetailProvider 
	implements VxUserDetailProvider<VxAuthenticationRequestToken, VxAuthentication> {
	
	@Override
	public VxUser getUserDetails(VxJwtAuthentication authentication) {
		if (authentication.getUser() != null) {
			return authentication
		}
		
		// 사용자 조회 로직 구현
	}
}

하지만 JWT 등의 인증 방식을 구현할 때는 토큰 클레임에 사용자 정보를 넣지 않고, Request 시 재조회하여 사용자 확인을 하는 것이 일반적인 방법이므로 Request마다 사용자 정보를 재 조회하는 부하가 발생한다.

이를 방지하기 위해 프레임워크에서는 VxCachedUserDetailProvider 객체를 지원한다.

VxCachedUserDetailProvider

VxCachedUserDetailProviderVxUserDetailProvider 인터페이스를 구현한 추상 클래스이다. 인터페이스에서 구현해야 할 getUserDetails 메소드는 캐시 조회/삭제/추가 등의 로직으로 이미 구현되어 있으며, 캐시 객체에 사용자 정보가 존재할 경우 캐시 정보를 반환하고, 없을 경우 사용자 정보를 조회한 후 반환 전 사용자 정보를 캐시에 추가하는 로직으로 구성된다.

VxCachedUserDetailProvider를 상속 받은 객체는 아래의 추상 메소드를 구현해야 한다.

구현

VxCachedUserDetailProvider는 사용자 정보를 조회하는 기능과 캐시 객체를 반환하는 메소드를 구현해야 한다.

public class CustomCachedUserDetailProvider
	extends VxCachedUserDetailProvider<UserNamePasswordAuthenticationRequestToken, VxJwtAuthentication, VxSystemUser> {

	private VxManagementUserDetailProvider baseProvider = new VxManagementUserDetailProvider();

	public CustomCachedUserDetailProvider() {
		super(VxSystemUser.class);
	}
	
	@Override
	protected Cache getCache() {
		return VxCacheManagerSupport.getCache(CacheNames.USER_CACHE);
	}

	@Override
	protected VxUser getInternalUserDetails(UserNamePasswordAuthenticationRequestToken authenticationRequestToken) {
		return baseProvider.getUserDetails(authenticationRequestToken);
	}

	@Override
	protected VxUser getInternalUserDetails(VxJwtAuthentication authentication) {
		return baseProvider.getUserDetails(authentication);
	}

}