개발자

next14의 next/headers의 cookies를 이용한 쿠키설정

2024년 08월 21일조회 166

안녕하세요 현재 데이터시각화 사이트 프로젝트를 진행중입니다. next14와 spring boot(리소스와 인증.인가)를 사용하고 있고, 카카오 소셜로그인을 하면 스프링서버에서 jwt(access 토큰)를 발급해주고 refresh 토큰은 redis를 통해 관리되고 있습니다. 받아온 토큰은 cookie를 통해 관리하고 있습니다. seo를 위해 ssr을 사용하고 있는데, ssr과정에서 데이터를 fetch를 할 때 토큰을 같이 보내고, 만약 액세스 토큰이 만료되고 리프레시 토큰이 살아있다면 응답 헤더에 새로운 액세스토큰을 보내주고 있습니다. 그런데 이때 next/headers의 cookies를 사용하여 쿠키를 세팅하는것이 안됩니다. 데이터 페치중, 혹은 ssr과정중에는 Cookies can only be modified in a Server Action or Route Handler. 라는 오류가 뜨며 cookie를 set 하거나 delete하는게 안됩니다. 이럴 경우는 어떻게 해야할까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

상현님의 프로필 사진

메세지가 알려주듯이 server action 과 router hanlder 영역 외에서는 next/cookies 모듈은 쿠키를 가공할 수 없습니다. 해당 모듈을 가이드하는 공식 문서에도 적혀있는 내용입니다. 해당 문서에 없는 내용을 더하자면, 1. client component에서 server action을 사용하고 그 안에서 next/cookies 모듈을 사용하면 client component에서는 사용할 수 없다는 메세지를 줄 겁니다. 2. server component에서 fetch한 경우에는 클라이언트 요청 정보를 route handler에서 확인하거나 클라이언트에게 보내는 것이 불가능합니다. 클라이언트(브라우저)가 없는 상황이 전제되기 때문인데요. 이 말은, access token을 refresh token에 기반해 자동 갱신하려는 - credential 인증을 거치지 않는 - 방식이 통하지 않는다는 이야기입니다. 참 아이러니한 일이라고 해야할텐데요. next.js가 메인 업데이트를 하면서 이전에는 쉽게 가능했던 것이 현재는 매우 어려워진 게 있는데 그게 jwt 자동 갱신입니다. app router에서 jwt 프로세스는, middleware에서 토큰을 리딩, 토큰이 유효하면 페이지 접속, 토큰이 만료라면 로그인 라우트로 이동 -> 계정 인증 -> 쿠키 재설정 의 전개입니다. 로그인은 클라이언트가 존재하는 상황이기에 이 프로세스가 가능합니다. ssr 방식을 쓰려 한다면 서버 전용의 토큰이나 계정이 필요합니다. get을 시도할 때 해당 토큰 혹은 계정으로 인증하면 데이터를 가져올 수 있습니다. 그러나 이 방식은 개인화된 정보를 가져올 수 없으므로 사실상 authorization이 필요하지 않는 seo를 위한 컨텐츠나 관리자에서 내부 직원들에게 오픈된 소스에만 적용할 수 있습니다. 아래의 스레드에서 보면 개발 측에서도 이 문제를 알고 있다고는 합니다. https://www.reddit.com/r/nextjs/comments/18a17qk/im_having_a_hard_time_setting_up_authentication/?rdt=44870 그렇지만 구조적으로 이 문제는 해결되기 쉽지 않습니다. app router는 이것 외에도 렌더링 순서상의 문제가 있어서 credential을 반드시 거치도록 하는 것이 이상적입니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 08월 21일

Next.js에서는 getServerSideProps 나 getInitialProps, API 라우트 등 서버사이드 함수 한정으로 쿠키를 조작할 수 있습니다. 토큰을 새로 발급하기 위해 서버에 요청을 보내고, 그 응답으로 새로운 토큰을 받아오는 과정은 서버사이드에서 이루어져야 합니다. SSR 과정에서 이를 처리하기 위해서는 페이지의 getServerSideProps 메서드에서 처리하면 됩니다. 추가로, Next.js 에서는 response 객체에 직접 접근하는 것은 지원되지 않으므로, express나 다른 Node.js 서버를 사용하여 proxy를 설정하고 이 proxy를 통해 쿠키 설정 및 JWT 토큰 교환 등을 수행하는 방법도 있습니다. Express 서버에서는 response 객체에 직접 접근할 수 있으므로, 상황에 맞게 쿠키를 세팅하거나 delete 할 수 있습니다.

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!