Next.js
로그아웃 뒤 뒤로가기로 보이던 관리자 화면을 막은 기준
로그아웃 API는 성공했지만 브라우저 뒤로가기에 관리자 내용이 남았다. 인증과 캐시를 분리해서 점검한 보안 메모.
로그아웃 성공이 화면 삭제를 뜻하지는 않았다
관리자에서 로그아웃한 뒤 브라우저의 뒤로가기를 눌렀더니 방금 보던 주문 목록이 잠깐 나타났다. 새 요청은 인증 없이 막혔지만, 이전 HTML이 브라우저 메모리에 남은 것이었다. 쿠키를 지웠으니 끝났다고 판단한 실수였다.
두 가지를 따로 검증했다
첫째는 보호된 URL을 새로 요청했을 때 401 또는 로그인 리다이렉트가 되는지다. 둘째는 뒤로가기와 새로고침에서 민감한 내용이 다시 그려지지 않는지다. 시크릿 창보다 같은 탭의 히스토리 테스트가 중요했다.
curl -I https://admin.example.com/orders
인증된 응답에는 민감도에 맞는 캐시 정책이 필요하다. 개인 정보가 있는 HTML에는 보통 다음처럼 둔다.
return new Response(html, {
headers: { 'Cache-Control': 'no-store, max-age=0' },
});
Next.js에서는 해당 경로를 동적으로 렌더링하고, 데이터 fetch에도 캐시 설정이 필요한지 함께 확인했다. 페이지 캐시만 막고 API 응답을 공유 캐시에 남기는 식의 반쪽 수정은 피했다.
로그아웃 처리에서 정한 순서
서버에서 세션을 무효화하고, 쿠키에는 만료와 HttpOnly, Secure, 적절한 SameSite를 적용했다. 그 다음 클라이언트 상태를 비우고 로그인 화면으로 이동시켰다. 클라이언트 상태 초기화는 UX를 위한 것이지 인증의 근거가 아니다.
마지막 점검
- 다른 탭의 보호 페이지를 새로고침했을 때 막히는가
- 뒤로가기 뒤 화면에 데이터가 남는가
- 응답에
no-store가 필요한 경로가 구분됐는가 - 로그아웃 뒤 토큰이 localStorage 등에 남지 않는가
보안 점검은 API 상태 코드 하나가 아니라 사용자가 실제로 밟을 화면 흐름으로 끝내야 했다.