next client & server, spring server 를 이용한 프로젝트입니다.
next-auth를 이용하여 nextClient-nextServer-springServer 구조로 로그인하도록 설계하였습니다.
next-auth 에서는 signOut() 메소드를 통해 세션을 비울 수 있다. 그러나 이 메소드는 signIn()과 다르게 callback이 없는 '이벤트'이다. 따라서 authOption의 event 중 signOut 이벤트를 통해 처리할 수 있다.
// ...imports
export const authOptions: NextAuthOptions = {
// ...codes
events: {
signOut: async () => {
// 로그아웃 이벤트 발생 전, 서버도 로그아웃
await serverAuth.post(API_PATH.AUTH.LOGOUT);
},
},
};
주석에서도 언급하였지만, events에서 정의한 함수의 실행 시점은 해당 이벤트의 발생 전이다. 로그아웃의 경우, 네트워크 오류로 spring 서버에서 로그아웃이 되지 않더라도, next-auth 서버 세션에서 정보를 삭제하므로써 실행이 가능하다. 이렇게 될 경우 spring 서버의 리소스를 낭비할 가능성이 있으나(그렇게 큰 낭비는 아니라고 생각한다), 사용자는 버튼을 누르자마자 로그아웃 되므로 훨씬 좋은 사용자 경험을 제공 할 수 있다.