구글 로그인 완료 후 브라우저 뒤로가기 → 같은 구글 계정 다시 선택 시, inote-server-5a63.onrender.com/?error=state_mismatch에 raw JSON 404가 뜸.
state는 CSRF 공격 방지용 1회용 토큰 — 로그인이 한 번 성공하면 DB(verification 테이블)에서 즉시 삭제됨state 값을 그대로 재사용해서 콜백을 보냄state로 DB를 조회 → 없음 → state_mismatch 에러verification not found)는 better-auth 내부 코드상 errorURL을 아예 안 담고 던짐 (데이터가 이미 삭제돼서 복구할 게 없음) → 우리가 로그인 시작 시 아무리 errorCallbackURL을 정확히 넘겨도 무시되고, 서버의 전역 기본값(${baseURL}/error, 즉 백엔드 자기 자신)으로 떨어짐Referer도, 이번 흐름은 앱 → 구글 → 백엔드로 도메인을 한 번 거치기 때문에 백엔드가 받는 시점엔 Referer가 accounts.google.com일 뿐, 원래 어느 앱(inote/inote-money)에서 시작했는지 정보가 이미 유실된 상태inote-server/src/auth/auth.ts:
onAPIError: {
errorURL: process.env.AUTH_ERROR_FALLBACK_URL ?? '<http://localhost:3011/login>',
},
inote의 로그인 페이지로 보냄inote-money 등 다른 프론트에서 같은 상황이 나면 inote-money가 아니라 inote 로그인 화면으로 잘못 이동함 (로그인 자체는 되어있어 화면이 깨지진 않지만, 엉뚱한 서비스로 이동)onAPIError fallback에서 그 쿠키를 읽어 원래 앱으로 정확히 복귀시키기 (inote-money 실서비스 전환 전 필수, inote-money/LEARNING.md에 기록해둠)