## 증상 로그인한 지 7일이 지나면 웹에서 모든 API 호출이 401을 받습니다. 사용자는 로그인 상태로 보이는데 아무 기능도 동작하지 않고, 이슈 #506 제보자는 이 때문에 시크릿 모드로 우회해서 샵을 쓰고 있었습니다. ## 발견 배경 1. #506 의 "깃허브에서 링크 눌러 들어오면 클라이언트 오류" 제보를 재현하려고 프로덕션 접속 → 랜딩·샵·마이페이지 전부 동일하게 깨짐 2. `/api/auth/session` 확인 → 세션은 살아 있는데 그 안의 accessToken 만 만료 ## 측정 같은 세션 안의 두 만료 시각입니다. | 항목 | 발급 | 만료 | 수명 | |---|---|---|---| | 백엔드 accessToken | 2026-07-27 | 2026-08-03 | 7일 | | NextAuth 세션 | 2026-09-02 | 2026-10-02 | 30일 (롤링 갱신) | 관측 시점 2026-09-02 기준 백엔드 토큰은 30일 전에 만료된 상태였고, 그 토큰으로 `GET /users` 는 401 `{"message":"Authorization fail"}` 을 반환했습니다. ## 원인 로그인 시 받은 토큰 외에 갱신 수단이 없습니다. 프론트는 만료된 토큰을 그대로 재사용하고, 세션 쿠키는 자체 수명대로 30일간 갱신됩니다. 백엔드는 세션 쿠키 수명을 모르고, 프론트는 토큰의 만료 시각을 검사하지 않습니다. ## 해결 방향 두 가지가 있고 아래쪽이 가볍습니다. - refresh token 발급과 갱신 엔드포인트를 추가한다. 사용자가 7일마다 다시 로그인하지 않아도 되므로 근본적이지만 작업량이 큽니다. - accessToken 수명을 세션 수명(30일)에 맞춘다. 재로그인 주기 문제는 남지만 세션이 유효한 동안에는 토큰도 유효합니다. 프론트에서는 만료된 토큰을 감지하면 세션을 함께 만료시켜 로그인 화면으로 보내도록 별도 수정 중입니다. 다만 그건 7일마다 재로그인을 강제하는 것이라, 위 둘 중 하나가 있어야 제대로 해결됩니다.
증상
로그인한 지 7일이 지나면 웹에서 모든 API 호출이 401을 받습니다. 사용자는 로그인 상태로
보이는데 아무 기능도 동작하지 않고, 이슈 #506 제보자는 이 때문에 시크릿 모드로 우회해서
샵을 쓰고 있었습니다.
발견 배경
접속 → 랜딩·샵·마이페이지 전부 동일하게 깨짐
/api/auth/session확인 → 세션은 살아 있는데 그 안의 accessToken 만 만료측정
같은 세션 안의 두 만료 시각입니다.
관측 시점 2026-09-02 기준 백엔드 토큰은 30일 전에 만료된 상태였고, 그 토큰으로
GET /users는 401{"message":"Authorization fail"}을 반환했습니다.원인
로그인 시 받은 토큰 외에 갱신 수단이 없습니다. 프론트는 만료된 토큰을 그대로 재사용하고,
세션 쿠키는 자체 수명대로 30일간 갱신됩니다. 백엔드는 세션 쿠키 수명을 모르고, 프론트는
토큰의 만료 시각을 검사하지 않습니다.
해결 방향
두 가지가 있고 아래쪽이 가볍습니다.
않아도 되므로 근본적이지만 작업량이 큽니다.
유효한 동안에는 토큰도 유효합니다.
프론트에서는 만료된 토큰을 감지하면 세션을 함께 만료시켜 로그인 화면으로 보내도록
별도 수정 중입니다. 다만 그건 7일마다 재로그인을 강제하는 것이라, 위 둘 중 하나가
있어야 제대로 해결됩니다.