개발자
(next.js 13버전 app route 기준) 안녕하세요. 이번 프로젝트에서 next-auth를 사용하여 인증 구현을 진행 하고 있는데요. 일반적인 사용법들은 구현을 하였습니다. - 클라이언트에서 signIn, signOut, update 등 session 제어 - 서버사이드에서 getServerSession를 사용하여 session 정보 확인 하지만, 아래의 두 가지를 구현하는 것에 있어 어려움을 겪고 있습니다. 1. 서버사이드에서 사이트 첫 접속 시(새로고침 시) session이 없다면 세션 자동 생성 2. 서버사이드 전용 axios 유틸 파일에서 session의 토큰이 만료되었다면, refresh token(쿠키)으로 새로운 access token을 가져와서 기존 session에 업데이트 후 재요청 next-auth를 많이 사용하는 것 같고, 서버와 클라이언트에서 적절히 사용하실 것 같은데 아무리 찾아봐도 위에 대한 해결책은 없는 것 같습니다. 1번 사항과 같이 서버 사이드에서 session을 즉시 만드는 경우는 저희 프로젝트에 좀 특수한 경우인 것 같고, 2번의 경우는 일반적인 토큰 갱신 방식인 것 같은데 토큰 갱신은 서버사이드에서 어떻게 할 수 있을까요? 해결 방안이 있거나, 이러한 상황에서는 어쩔 수 없이 access token을 쿠키로만 관리해야 하는 것인지 의견 부탁 드립니다. 서버와 클라이언트에서 access token의 만료 갱신 처리를 위해 access token을 보통 어디에 관리하시나요? cookie만이 방법일까요?
1import { ReactNode } from 'react';
2import { getServerSession } from 'next-auth/next';
3import { authConfig } from '@/_config/auth.config';
4import { cookies } from 'next/headers';
5import { signIn } from 'next-auth/react';
6
7async function PageLayout({ children }: { children: ReactNode }) {
8 const cookieStore = cookies();
9 const refreshToken = cookieStore.get('refresh-token')?.value;
10 const session = await getServerSession(authConfig);
11
12 if (refreshToken && !session) {
13 await signIn(); // signIn은 클라이언트 기반이라 에러 발생 됨
14 }
15
16 return <>{children}</>;
17}
18
19export default PageLayout;
답변 1
익명
작성자
2023년 11월 24일
cookie 방식으로 처리하는 것으로 결정하였습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 11월 11일
안녕하세요. Next-auth의 session 관리는 서버 사이드에서 조치를 취하는 것이 상대적으로 제한적입니다. 이 라이브러리는 주로 클라이언트 사이드에 초점을 맞추고 있기 때문입니다. 현재 코드에서 `signIn()` 함수 사용을 살펴보면, 이것은 클라이언트 사이드에서 작동하도록 설계된 함수입니다. 따라서 서버사이드 컴포넌트에서 사용하시려고 하면, 문제가 발생할 수 있습니다. 1번과 같은 경우, 쿠키를 이용한 세션 생성 방법으로 생각해볼 수 있습니다. 사용자가 첫 접속 시에 서버사이드에서는 Unique 한 값(예: UUID)을 생성하여 이를 set-cookie 헤더로 응답에 포함시켜 보내줄 수 있으며, 이후 해당 유저는 쿠키 값(UUID)를 가지고 세션을 유지하게 됩니다. 2번의 경우 일반적인 방법은 `refresh token`을 사용하는 것입니다. Access Token가 만료되었을 때 Refresh Token을 통해서 새로운 Access Token을 발급 받아와서 사용하는 방식입니다. 그래서 대부분의 경우에 Refresh Token은 보안상 안전한 곳(DB 등)에 저장하고 관리합니다. 만일 Next Auth 도구만으로 해결하시려면, `jwt callback`을 사용하여 토큰 갱신이 필요한 시점에 새로운 토큰을 생성 및 반환하는 방법이 있습니다. 이는 서버 사이드에서 작동하기 때문에 일부 질문을 해결할 수 있을지도 모릅니다. 따라서 위의 상황은 대체적으로 Next Auth 외의 방법(access token과 refresh token 사용 등)으로 처리하거나, 다른 인증 라이브러리를 고려하셔야 할 수 있다는 점 참고 부탁 드립니다. 기술적인 연구와 개발에 열중하시는 것 같아 보기 좋습니다. 질문 내용도 자세해서 답변하기가 수월했습니다. 앞으로 좋은 결과 있으시길 바랍니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!