:visited를 더 비공개로 설정

Kyra Seevers
Kyra Seevers

게시일: 2025년 4월 2일

링크를 클릭하면 어떻게 되나요? 보라색으로 변합니다.

인터넷 초기부터 사이트는 CSS :visited 선택자를 사용하여 사용자가 이전에 클릭한 링크에 맞춤 스타일을 적용해 왔습니다. 사이트는 :visited 선택기를 사용하여 사용자 환경을 개선하고 사용자가 웹을 탐색하는 데 도움을 줄 수 있습니다. 하지만 방문한 링크의 맞춤설정 가능성은 시간이 지남에 따라 증가함에 따라 보안 연구원이 발견한 공격의 수도 증가했습니다.

이러한 공격을 통해 사용자가 방문한 링크가 노출되고 웹 탐색 활동에 관한 세부정보가 유출될 수 있습니다. 이 보안 문제는 20년 넘게 웹을 괴롭혀 왔으며 브라우저는 이러한 기록 감지 공격을 완화하기 위해 다양한 임시 조치를 도입했습니다. 이러한 완화 조치를 통해 공격 속도가 느려지지만 완전히 제거되지는 않습니다.

Chrome 136부터 Chrome은 이러한 공격을 지원 중단한 최초의 주요 브라우저입니다. 이는 :visited 링크 기록을 파티션화하여 실행됩니다.

이전에 방문한 링크를 표시하려면 브라우저에서 시간이 지남에 따라 방문한 페이지를 추적해야 합니다. 이를 :visited 기록이라고 합니다. CSS :visited 선택기를 사용하여 방문한 링크의 스타일을 방문하지 않은 링크와 다르게 지정할 수 있습니다.

:visited {
  color: purple;
  background-color: yellow;
  }

이전에는 :visited 기록이 파티션되지 않았습니다. 즉, :visited 선택기를 사용하여 :visited 기록을 표시할 수 있는 위치에 제한이 없었습니다. 링크를 클릭하면 해당 링크가 표시되는 모든 사이트에 :visited로 표시됩니다. 이는 공격자가 사용자의 방문 기록에 관한 정보를 공개할 수 있게 하는 핵심 설계 결함이었습니다.

다음 예를 참고하세요. 사이트 A에서 탐색하다가 링크를 클릭하여 사이트 B로 이동합니다. 이 시나리오에서는 사이트 B가 :visited 기록에 추가됩니다. 나중에 사이트 B에 대한 링크도 생성하는 사이트 Evil을 방문할 수 있습니다. 파티셔닝을 사용하지 않으면 Site Evil에서 링크를 클릭하지 않았더라도 Site Evil의 링크가 Site B로 :visited로 표시됩니다. 그러면 악의적인 사이트에서 보안 악용 프로그램을 사용하여 링크의 스타일이 :visited인지 확인하여 사용자가 이전에 사이트 B를 방문했음을 알 수 있으므로 방문 기록에 관한 정보가 유출됩니다.

파티션하기 전에 링크를 클릭하면 다음과 같은 문제가 발생했습니다.

site-b.com 링크를 표시하는 site-a.com 페이지를 사용자에게 표시합니다.

이 링크를 표시하는 모든 사이트에 :visited로 표시됩니다.

site-evil.com과 함께 동일한 site-a.com을 표시합니다. 두 페이지 모두 site-b.com으로 연결되는 동일한 링크를 표시하며 방문한 것으로 스타일이 지정됩니다.

파티셔닝은 이전에 이 사이트에서 해당 링크를 클릭한 경우에만 링크를 방문한 것으로 표시하여 방문 기록을 보호합니다. 이전에 이 사이트와 상호작용한 적이 없다면 링크의 스타일이 :visited로 지정되지 않습니다.

파티션이 사용 설정된 이전 예를 생각해 보세요. 사이트 A를 탐색하다가 링크를 클릭하여 사이트 B로 이동하면 '사이트 A + 사이트 B' 조합이 방문 기록에 저장됩니다. 이렇게 하면 Site Evil을 방문할 때 Site B로 연결되는 링크가 :visited로 표시되지 않습니다. 'Site A + Site B' 항목 (원래 링크를 클릭한 컨텍스트)의 두 부분과 일치하지 않기 때문입니다. Site Evil에는 방문 기록이 표시되지 않으므로 악용 프로그램을 활용할 수 없습니다. 따라서 브라우저 기록은 안전합니다.

파티션 후 링크를 클릭하면 다음과 같이 표시됩니다.

site-b.com 링크를 표시하는 site-a.com 페이지에 사용자를 표시합니다.

이전에 클릭한 곳에만 :visited로 표시됩니다.

site-evil.com과 함께 동일한 site-a.com을 표시합니다. 두 페이지 모두 site-b.com으로 연결되는 동일한 링크를 표시하지만 site-a.com의 링크만 방문한 것으로 표시됩니다.

간단히 말해 파티셔닝은 링크가 클릭된 위치에 관한 추가 정보와 함께 링크를 저장하는 것을 말합니다. Chrome에서는 링크 URL, 최상위 사이트, 프레임 출처입니다. 파티셔닝을 사용 설정하면 :visited 기록이 더 이상 모든 사이트에서 쿼리할 수 있는 전역 목록이 아닙니다. 대신 :visited 기록은 처음에 해당 링크를 방문한 컨텍스트에 따라 '분할'되거나 구분됩니다.

링크 URL, 최상위 사이트, 프레임 출처를 통한 정보 흐름을 보여줍니다.

인터넷을 탐색할 때 동일한 사이트의 서로 다른 하위 페이지로 연결되는 여러 링크를 클릭하게 될 수 있습니다. 예를 들어 다양한 유형의 금속을 조사할 때 '크롬' 및 '황동'의 Site.Wiki 페이지를 방문할 수 있습니다.

엄격한 파티셔닝 구현에서는 금 Site.Wiki 페이지의 사용자에게 크롬 및 황동 페이지 링크가 :visited로 표시되지 않습니다. 이는 사용자가 골드의 Site.Wiki 페이지와 일치하지 않는 최상위 사이트에서 이러한 각 페이지를 클릭했기 때문입니다.

사용자가 metals.com에서 site.wiki의 링크를 방문했지만 metals.com에서 클릭했기 때문에 링크가 방문한 것으로 표시되지 않습니다.

이 시나리오에서 사용자 환경을 개선하면서도 파티셔닝의 개인 정보 보호 및 보안 보호 기능을 계속 제공하기 위해 자체 링크에 대한 예외를 도입했습니다. 간단히 말해 사이트는 이러한 링크가 이전에 이 컨텍스트에서 클릭되지 않았더라도 자체 하위 페이지를 :visited로 표시할 수 있습니다. 사이트는 사용자가 하위 페이지를 방문했는지 추적하는 다른 방법이 있으므로 자체 링크가 도입되어도 이러한 사이트에 새로운 정보가 제공되지 않습니다. 파티셔닝은 여전히 크로스 사이트 추적을 방지하고 동일 출처 정책을 시행합니다. 하지만 이는 사이트 자체 하위 페이지로 연결되는 링크에만 적용된다는 점에 유의해야 합니다. 서드 파티 사이트로 연결되는 링크 또는 서드 파티 iframe의 링크에는 이 예외가 적용되지 않습니다.

'자체 링크' 제외 후:

이제 동일한 사이트의 하위 페이지인 경우 자체 링크가 방문한 것으로 표시됩니다.

구현 상태

이러한 :visited 보안 및 개인 정보 보호 개선사항은 Chrome 버전 136부터 사용할 수 있습니다. Chrome은 사용자를 위해 이러한 보호 기능을 구현한 최초의 브라우저입니다.

참여 및 의견 공유