설정한 쿠키가 페이지 이동 후 사라질 때 의심해 볼 상황
getServerSideProps에서 writeHead 또는 setHeader로 쿠키를 설정하고 redirect 시
등록된 쿠키가 사라지는 상황이 있다.
redirect된 페이지에서 쿠키가 사라진다면 헤더 설정의 문제를 확인해 봐야 한다.
합리적으로 의심해 볼 수 있는 문제는 페이지 이동 후 쿠키가 사라졌으므로 쿠키의 사용 범위에 대한 설정 문제이다.
Path=/ 설정은 쿠키가 모든 경로에서 유효하도록 설정하는 옵션이다. 이 옵션을 통해 모든 페이지에서 쿠키에 접근할 수 있도록 설정하므로 해당 옵션이 누락되면 페이지 이동 시 쿠키가 사라지는 문제가 발생한다.
setHeader와 writeHead를 사용해 path=/를 포함하는 쿠키 설정 예제를 확인해보자.
HttpOnly는 클라이언트의 자바스크립트에서 쿠키에 접근할 수 없도록 설정하는 옵션이다.
export async function getServerSideProps({ req, res }) { res.setHeader('Set-Cookie', 'myCookie=value; Path=/; HttpOnly; Max-Age=3600'); return { redirect:{ destination: '/new-page', // redirect할 페이지 permanent: false } } }
writeHead의 사용도 확인해보자.
export async function getServerSideProps({ req, res }) { const cookieVal = 'myCookie=value; Path=/; HttpOnly; Max-Age=3600'; res.writeHead(302, { Location: 'new-page', // redirect할 페이지 'Set-Cookie': cookieVal, 'Custom-Header': 'Custom', // 커스텀 헤더 }); res.end(); return { props: {} }; }
writeHead의 첫 번째 파라미터는 HTTP 응답 상태 코드, 두 번째는 헤더 객체를 설정한다.
헤더 객체 내부의 Location 필드로 redirect 페이지를 설정할 수도 있고, return 문에 redirect를 전달하면서 페이지를 설정할 수도 있다.
Next.js의 기본 권장 방식은 return 문에서 redirect를 전달하는 방법이다.
그렇다면 writeHead와 setHeader의 차이점은 무엇일까?
- writeHead는 상태 코드를 설정(setHeader는 불가능)할 수 있는 등의 세세한 설정을 할 수 있다.
- setHeader는 응답이 시작(res.end())되기 전 여러 번 호출이 가능하지만 writeHead는 한번만 호출한다.
따라서 상태 코드와 여러 헤더를 동시에 설정하려면 writeHead, 개별적으로 헤더를 추가하고 수정할 때는 setHeader를 사용하는 것이 좋다.
이와 같이 Path=/를 추가하면 이동하는 페이지에 상관없이 애플리케이션에서 쿠키를 확인할 수 있다.
추가 참고 : Next.js 공식 문서(Setting Headers)