✅ 대표적인 2가지 방식

1. localStorage + storage 이벤트 활용 (가장 많이 쓰임)

// 로그아웃 함수
const logout = () => {
  localStorage.setItem("logout", Date.now().toString()); // 로그아웃 트리거
  // 실제 로그아웃 처리
};

// 다른 탭에서 로그아웃 감지
useEffect(() => {
  const onStorage = (event: StorageEvent) => {
    if (event.key === "logout") {
      // 여기서 로그아웃 처리
      router.push("/login");
    }
  };

  window.addEventListener("storage", onStorage);
  return () => window.removeEventListener("storage", onStorage);
}, []);

📌 주의: storage 이벤트는 다른 탭에서만 발생합니다. 자기 탭에서는 발생하지 않음.

2. BroadcastChannel API 사용 (보다 명시적인 탭 간 통신)

// 채널 생성
const channel = new BroadcastChannel("auth");

// 로그아웃 시
const logout = () => {
  channel.postMessage({ type: "logout" });
  // 실제 로그아웃 처리
};

// 로그아웃 메시지 수신
useEffect(() => {
  channel.onmessage = (event) => {
    if (event.data.type === "logout") {
      // 로그아웃 처리
      router.push("/login");
    }
  };

  return () => channel.close();
}, []);

보안적으로도 고려해야 할 점

BroadcastChannel란?

BroadcastChannel브라우저 내 여러 탭(또는 iframe 등) 간에 메시지를 주고받을 수 있게 해주는 Web API입니다. 쉽게 말해서, 같은 도메인 안의 탭들끼리 "채팅"할 수 있게 해주는 통신 채널이라고 보면 돼요.

📦 어떤 상황에서 유용할까?