BFCache 복원 여부와 페이지 상태 처리

BFCache는 뒤로·앞으로 탐색에서 조건에 맞는 문서와 실행 상태를 메모리에 보관했다가 복원하는 브라우저 기능입니다. 일반 HTTP 캐시와 달리 응답 파일만 저장하는 것이 아니라 페이지 상태를 보존합니다. 적격성은 브라우저·페이지 상태에 따라 달라지고 보관된 항목도 메모리 회수로 사라질 수 있으므로, 복원 속도나 성공률을 보장하는 기능으로 보면 안 됩니다.

풍경이 그려진 페이지 카드, 겹쳐 놓인 페이지 묶음, 다시 나타난 페이지를 보여주는 비유적 삽화

페이지를 보관했다가 되돌리는 비유입니다. hidden·frozen 상태나 pagehide·pageshow 이벤트를 나타낸 그림은 아닙니다.

어떤 신호가 실제 복원을 확인하는가

뒤로·앞으로 이동 뒤 pageshow 이벤트에서 persisted === true이면 저장된 문서가 실제 복원된 것입니다. pagehide.persisted === true는 브라우저가 보존을 시도한다는 뜻일 뿐, 나중의 복원을 보장하지 않습니다. Chromium의 freeze·resume 이벤트는 백그라운드 탭 동결에도 발생할 수 있어 BFCache 측정에는 pageshow.persisted를 기준으로 삼습니다.

복귀 후 무엇을 확인할까

예를 들어 결제 페이지를 열어 둔 채 다른 화면에서 장바구니를 변경한 뒤 돌아왔다고 가정해 보세요. 먼저 pageshow.persisted로 실제 복원인지 확인하고, 복원된 경우 서버에서 가격·재고 등 바뀔 수 있는 정보를 다시 확인합니다. 동결 중 끊겼을 수 있는 연결은 한 번만 재연결하고, 저장하지 않은 입력은 앱의 정책에 따라 복원하거나 사용자에게 확인합니다. 이 순서는 설명을 위한 가상 상황이며, 특정 앱에서 실행한 결과가 아닙니다.

적격성 문제를 진단하는 순서

  1. 대상 브라우저의 진단 도구에서 실제 뒤로가기 경로를 실행하고 복원 여부와 제외 사유를 기록합니다.
  2. unload에 필수 저장·정리 작업을 맡기지 말고, 필요한 경우 pagehide를 사용합니다. beforeunload는 저장하지 않은 변경을 경고해야 할 때만 조건부로 등록합니다.
  3. WebSocket, WebRTC, IndexedDB 같은 연결·공유 자원은 모든 브라우저에서 같은 방식으로 BFCache를 막는다고 단정하지 말고, 해당 엔진과 버전에서 보고된 사유를 확인합니다. 페이지를 떠날 때 닫아야 한다면 pagehide에서 정리하고, 실제 복원 뒤 pageshow에서 복구합니다.
  4. 민감 정보 보호를 위한 Cache-Control: no-store를 BFCache 우회 수단으로 쓰지 않습니다. 복원 후 민감하거나 바뀔 수 있는 데이터는 갱신·제거합니다.

성능 보고에는 브라우저·버전·경로별 실제 pageshow.persisted 복원 횟수와 복귀 시간을 기록하고, 일반 탐색의 첫 로드 지표와 분리합니다. 한 페이지에서 성공한 시험은 사이트 전체의 복원률을 보여주지 않습니다.

참고 자료