탭 간의 데이터 공유하는 방법, Broadcast Channel API
웹 어플리케이션을 사용하다보면 같은 사이트를 여러 탭에서 열어두는 경우가 많습니다. 이때 한 탭에서 로그아웃을 했는데 다른 탭은 로그인 화면을 계속 보여주거나, 장바구니가 탭마다 다르게 보이면 사용자 경험은 떨어지게 됩니다. 이러한 문제를 간단하게 해결할 수 있는 브라우저 기능이 BroadcastChannel API 입니다. 같은 출처의 탭, 창, 아이프레임, 웹 워커사이에서 메세지를 실시간으로 주고받을 수 있게 해주는 웹 표준 API이며, 별도 라이브러리나 서버 연결없이 사용할 수 있다는 것이 큰 장점입니다. BroadcastChannel API는 현재 모던 브라우저에서 지원이 되고 있습니다. BroadcastChannel API가 무엇인가요? BroadcastChannel API는 이름이 같은 채널에 연결된 모든 브라우저 컨텍스트에 메세지를 전송하는 기능입니다. 여기서, 브라우저 컨텍스트란 다음과 같은 실행 공간을 의미합니다. 같은 사이트의 다른 탭 새 창 또는 팝업 창 아이프레임 웹 워커 예를 들어 new BroadcastChannel(“auth”)로 auth 라는 채널을 만들면, 같은 출처에서 auth 채널을 구독하고 있는 다른 탭들이 메세지를 받을 수 있습니다. 여기서 중요한 점은 같은 origin (프로토콜, 도메인, 포트의 조합)이여야 한다는 점이 관건입니다. 서로 다른 도메인 간의 통신을 위한 도구가 아니기에, 다른 출처의 아이프레임 또는 팝업과 통신을 해야한다면 이런 경우에는 window.postMessage() 를 사용해야합니다. 기본적인 사용 방법 초기 세팅부터 사용 방법이 많이 복잡할 것 같지만, 생성자를 통해 생각보다 쉽고 간단하게 세 단계 정도로 나누어 사용할 수 있습니다. 브로드캐스트로 사용할 채널을 생성합니다. 메세지를 수신할 이벤트 리스너를 등록합니다. postMessage() 로 메세지를 보냅니다. 이 코드를 같은 사이트의 서로 다른 두 탭에서 실행하게 되면, 한 탭이 보낸 메세지를 다른 탭이 받는 구조가 됩니다. 여기서 확인해야할 점은 메세지를 보낸 BroadcastChannel 객체 자신은 메세지를 받지 않는다는 것입니다. 첫 번째 탭에서channel.postMessage() 를호출하면 두 번째 탭에서는 메세지를 수신하지만, 첫 번째 탭의 같은 channel 객체에는 message 이벤트가 발생하지 않습니다.
현우
