사람들은 브라우저를 비롯해 웹 콘텐츠를 가져오고 보여주거나 사용자를 대신해 조작하는 소프트웨어인 사용자 에이전트를 통해 웹을 이용한다. W3C 문서는 사용자 에이전트가 사용자에게 져야 할 의무로 보호, 정직, 충성을 제시하고, 이 의무가 표준과 공동체 논의를 통해 자리 잡아야 한다고 설명한다.

사용자 에이전트란

사용자 에이전트는 사용자를 대신해 자신이 속한 곳 바깥의 웹사이트와 상호작용하는 소프트웨어다. 웹사이트의 콘텐츠를 보여주는 것만 하거나 사용자가 요청·허가한 작업을 수행하는 경우도 포함한다. 공개 웹의 임의 콘텐츠를 불러올 수 있는 제품은 사용자 에이전트다. 한 사람은 일상에서 여러 사용자 에이전트를 이용할 수 있다.

다른 맥락에서는 이메일 클라이언트를 비롯해 사용자의 작업을 돕는 소프트웨어를 사용자 에이전트라고 부르기도 한다. 이메일 클라이언트는 적어도 1980년대 후반부터 ‘메일 사용자 에이전트’로 불렸다(RFC1123). 운영체제, PDF·전자책·이미지 뷰어, 디지털 지갑을 포함한 자격 증명 관리자 등도 사용자 에이전트로 볼 수 있다. 그러나 이 문서와 웹 표준에서 사용자 에이전트는 사용자를 대신해 웹사이트와 상호작용하는 소프트웨어를 가리킨다.

웹에서 가장 흔한 사용자 에이전트는 웹 브라우저이며, 사이트 간 링크를 따라갈 수 있는 앱 내 브라우저도 포함된다. 검색 엔진, 음성 기반 비서, 웹사이트 콘텐츠의 일부나 요약을 보여주는 생성형 AI 시스템도 사용자 에이전트에 해당할 수 있다. 이들은 사용자가 웹사이트를 찾고 이용하도록 돕거나 사용자를 대신해 자동화된 작업을 수행한다.

사용자 에이전트의 동작은 웹 표준이나 일반적인 기술 사양만으로 전부 정해지지 않는다. 사용자 에이전트는 사용자에게 가장 잘 봉사하도록 어떤 기능을 구현할지, 각 기능을 어느 정도 제공할지 선택한다. 구현한 기능을 둘러싼 독자적인 인터페이스와 동작도 만든다. 예를 들어 권한 요청, 오류 메시지, 개인정보 보호 표시의 문구와 아이콘은 사용자 에이전트마다 다를 수 있다. 북마크, 읽기 모드, 개발자 도구처럼 사양에서 요구하지 않는 기능을 추가하기도 한다.

사용자 에이전트는 더 큰 애플리케이션의 일부일 수 있고, 웹 플랫폼 전체나 일부를 구현하는 라이브러리를 호출할 수도 있다. 애플리케이션이 사용자 에이전트인 부분과 아닌 부분을 명확히 구분한다면, 외부 콘텐츠를 탐색하는 사용자 에이전트 부분만 사용자 에이전트의 의무를 따라야 한다. 애플리케이션 자체 콘텐츠만 보여주는 부분은 자체적으로 동작할 수 있지만, 애플리케이션은 각 부분에서 예상할 수 있는 동작을 사용자에게 분명히 알려야 한다. 반대로 외부 콘텐츠를 볼 때 주소 표시줄이나 콘텐츠 출처를 나타내는 다른 표시가 없는 등 내부 콘텐츠와 외부 콘텐츠의 구분이 충분히 작다면, 애플리케이션은 자체 콘텐츠를 보여줄 때도 사용자 에이전트의 의무를 따라야 한다.

웹 플랫폼 라이브러리 자체가 사용자 에이전트인지는 그 기능에 따라 달라진다. SFSafariViewController와 Android Custom Tabs는 사용자 에이전트의 의무를 맡고, 탐색하는 외부 콘텐츠와 임베딩한 애플리케이션이 관리하는 콘텐츠를 명확히 구분한다. 따라서 이 라이브러리들은 사용자 에이전트다.

반면 Android, iOS, Windows용 WebView 라이브러리는 다양한 애플리케이션을 지원하도록 설계됐다. 일부 애플리케이션은 자체 콘텐츠만 포함하므로, WebView 라이브러리 자체는 사용자 에이전트가 아니며 사용자 에이전트의 의무도 구현하지 않는다.

WebView를 포함하는 애플리케이션이나 그 일부가 사용자 에이전트로 동작한다면, 해당 애플리케이션이 사용자 에이전트의 의무를 지킬 책임이 있다. 애플리케이션이 사용자 에이전트 라이브러리를 통해서만 외부 콘텐츠를 탐색한다면 이를 지키기는 비교적 간단할 수 있다. 사용자 에이전트가 아닌 WebView로 앱 내 브라우저를 구현할 때는 개발자가 의무 준수에 각별히 주의해야 한다.

사용자 에이전트의 의무

각 사용자 에이전트는 다른 이해관계자가 아니라 사용자를 위해 일한다(인터넷은 최종 사용자를 위한 것). 사용자 에이전트가 지는 의무는 공동 논의를 통해 정해지고, 사용자 에이전트가 구현하는 여러 표준에 반영된다.

보호

웹페이지를 방문하는 일은 안전해야 한다. 페이지를 방문했다는 사실만으로 페이지가 사용자의 컴퓨터나 환경을 바꾸어서는 안 된다. 예를 들어 소프트웨어를 설치하거나 하드웨어에 접근해서는 안 된다.

사이트나 다른 관찰자에게 공개되는 데이터는 사용자의 선호에 부합하고 데이터 최소화 원칙을 따라야 한다. 특히 사용자 에이전트는 사이트가 사용자의 활동을 추적할 가능성을 제한해야 한다(허가되지 않은 추적).

사용자는 양식을 작성하거나 권한을 허용하는 방식으로 더 많은 정보를 공유하기로 선택할 수 있다. 이 경우에도 사용자 에이전트는 사용자가 속임수를 피하도록 돕고, 페이지가 더 높은 수준의 접근 권한을 얻으려 할 때 이를 분명히 알려야 한다.

페이지가 여러 권한을 한꺼번에 요청한다면, 사용자가 충분한 정보를 바탕으로 동의할 수 있도록 요청된 권한 중 일부만 허용할 수 있어야 한다. 또한 사용자는 자신이 허용하는 권한의 전체 목록을 알 수 있어야 한다.

사이트의 악성 코드가 사용자 에이전트의 경계를 벗어나 사용자의 컴퓨터를 바꾸거나 다른 출처(origin)에 접근하지 못하게 해야 한다. 사용자 에이전트는 구성 요소를 샌드박스에 격리하고, 메모리 안전 언어를 사용하며, 보안팀을 두어 취약점을 찾아 대응하는 방식으로 보호 의무를 이행한다. 새로운 위협에 대응하려면 이러한 방어를 계속 발전시켜야 한다.

서로 관련 없는 웹사이트를 방문할 때 임베디드 iframe에 공통 식별 쿠키를 보내지 않는 것은 가능하다. 그런 쿠키를 보내는 브라우저는 보호 의무를 어기는 셈이다. 그러나 현재 안정적인 IP 주소를 노출하는 일은 피할 수 없으므로 의무 위반은 아니다.

사용자가 파일을 명시적으로 선택하거나 열지 않는 한, 페이지가 로컬 파일에 접근하지 못하게 해야 한다. 이 원칙은 file: URL마다 별도의 출처를 부여하고, <input type=file> 업로드에서 경로 구성 요소를 제거하며, @font-face 규칙에서 사용할 수 있는 로컬 글꼴을 제한하는 동작의 근거가 된다. 사용자는 업로드나 다운로드 등을 통해 파일을 공유할 수 있다. File System Access 같은 API도 사용자가 올바른 결정을 내릴 도구를 제공받는다면 보호 의무를 위반하지 않는다.

사용자 에이전트는 방문자를 공격하는 페이지를 식별하려고 해야 한다. 사용자가 그런 페이지에 접속하기 시작하면 접근을 차단하거나 경고하는 등 피해를 막으려 할 수 있다.

정직

사용자 에이전트는 웹과 사용자 사이에서 중개자 역할을 하며 무슨 일이 일어나는지 사용자가 이해할 수 있는 방식으로 설명한다. 자동으로 또는 사용자를 대신해 작업할 때는 그 작업과 결과를 분명히 알린다. 콘텐츠를 바꾸거나 사용자를 대신해 행동해 사용자가 이를 쉽게 알아차릴 수 없는 경우에는 어떤 정보원을 이용했고, 어떤 작업을 했으며, 어떤 결과가 나왔는지 의미 있게 보여준다.

설명에는 문구, 권한 요청 창, 표시 아이콘, 미리보기 등 여러 인터페이스 요소를 사용할 수 있다. 이런 요소를 어디에 배치할지, 무엇을 강조해야 할지도 고려해야 한다.

웹사이트가 암호화된 연결을 통해 제공되는지 표시하는 것은 대표적인 사례다. 표시 방식은 보안되지 않은 사이트에 깨진 자물쇠 아이콘을 붙이는 방식에서, 일부 사용자 에이전트가 URL 표시줄에 ‘안전하지 않음’이라는 문구를 명시하는 방식으로 발전해 왔다.

Media Capture and Streams 같은 사양에는 사용자 에이전트가 특정 웹사이트 동작을 설명하도록 하는 개인정보 보호 표시 요구사항이 포함돼 있다. 사양이 해당 동작을 구체적으로 지정하지 않았더라도 사용자가 알아야 하는 다른 동작에 같은 설명 방식을 적용해야 한다.

정직한 사용자 에이전트는 단지 거짓말을 하지 않는 데 그치지 않고 사용자에게 진실을 전달하려고 적극적으로 노력한다. 설명은 현재 상태와 예상되는 결과를 분명히 나타내고, 완곡하거나 모호한 표현을 피하며, 민감한 활동이 일어나고 있음을 명확하게 알려야 한다.

사용자 에이전트는 설명을 언제, 얼마나 자주 보여줄지 정한다. 설명은 도움이 될 때 제시해 정보를 주되 사용자의 주의를 불필요하게 분산시키지 않아야 한다. 또한 사용자가 결정을 내릴지, 언제 내릴지 통제할 수 있게 해야 한다.

웹사이트가 위치 정보나 오디오 녹음처럼 오래 유지되는 권한을 사용한다면, 사용자 에이전트는 URL 표시줄에 표시 아이콘을 보여주는 방식으로 현재 상황을 알릴 수 있다. 반대로 브라우저가 특정 사이트가 아니라 브라우저에 계정 정보를 제공하도록 사용자를 설득한 뒤, 추적이나 광고 타기팅 같은 다른 목적으로 그 정보를 조용히 사용하는 것은 정직한 행동이 아니다. 사용자 에이전트는 선택에 따른 상충 관계를 분명히 알려야 한다.

충성

사용자 에이전트는 구현자의 이익이나 다른 당사자의 이익보다 사용자의 이익을 우선해야 한다.

사용자 에이전트를 제공하는 조직이 사용자 에이전트의 기능을 결정하거나 사용자의 미래 선택지를 제한하는 결정에 참여할 때도 충성 의무가 적용된다. 이런 결정 과정에서 사용자가 충분히 대표되지 않을 수 있으므로, 조직은 다양한 사용자의 이익을 파악하고 대변하기 위해 합리적인 조치를 취해야 한다. 다만 자신이 사용자를 대표하는 유일한 주체라고 여겨서는 안 된다.

사용자 에이전트는 서비스 제공에 앞서 페이지가 요구하는 신뢰할 만한 약속을 사용자가 하도록 도울 수도 있다. 여기서 신뢰할 만한 약속은 사용자가 앞으로 선택할 수 있는 범위를 의도적으로 제한하는 것이다. 서비스를 받은 뒤에도 그 약속을 유지하는 것이 곧 불충성은 아니다. 충성에 부합하는 약속은 해당 서비스의 이용만 제한하고, 사용자의 다른 데이터·설정·선택지는 제한하지 않는다. 사용자는 추가 불이익 없이 서비스를 그만두고 데이터를 지울 수 있어야 한다.

EME 사례: 불완전한 공동 협상 방식의 약속 장치

2012년 무렵 사용자 에이전트 업체와 W3C는 저작권자가 디지털 권리 관리(DRM)를 이용해 미디어의 추가 복사를 기술적으로 어렵게 하는 비웹 플랫폼에서만 콘텐츠 재생을 허용할 것을 우려했다. 단순한 디지털 파일은 복사를 막을 수 없으므로 약속만으로는 신뢰를 얻기 어렵다.

사용자 에이전트 업체와 다른 W3C 회원들은 저작권자 및 그 대표자들과 사실상 공동 협상에 들어갔다. 그 결과 브라우저는 Encrypted Media Extensions(EME)라는 DRM 시스템을 제공하기로 했다. 그 대가로 사용자는 웹에서 미디어에 접근할 수 있게 됐고, DRM은 제한된 권한으로 실행되며 웹사이트에 영구적인 기기 식별자를 제공하지 않는 등 사용자를 위한 일부 제한을 적용받았다.

EME에서 개별 사용자는 명시적인 약속을 하지 않는다. 대신 사용자 에이전트는 표준화된 합의를 구현하고, 사용자가 제한된 미디어를 재생하기로 하면 복사 제한을 자동으로 적용한다. 콘텐츠를 받은 뒤 사용자 에이전트가 파일 복사를 돕지 않는 것은 충성 의무 위반처럼 보일 수 있다. 그러나 이 약속은 사용자가 받기로 한 미디어에만 제약을 가하고 다른 데이터·설정·선택지는 제한하지 않는다. 약속이 없었다면 사용자는 애초에 해당 미디어를 받지 못했을 수도 있다.

약속이 사용자에게 이익이 되는지 평가하려면 사용자가 얻는 이익과 부과되는 제한을 저울질해야 한다. 적절한 균형은 상황에 따라 다르지만, 사용자의 이익을 실제로 고려한 평가를 거쳐야 충성에 부합하는 약속이 된다.

많은 사람은 EME가 실수였다고 본다(예: EFF의 상호운용성 옹호). 비판자들은 EME가 다음과 같은 문제를 낳는다고 지적한다.

  • 사람들이 저작권의 ‘공정 이용’과 ‘공정 취급’ 예외를 활용하지 못하게 한다.
  • 시청자의 접근성을 높이는 미디어 각색을 막는다.
  • 구매한 미디어의 제공 서버를 사용할 수 없게 되면 해당 미디어에 접근하지 못하게 한다.
  • 저작권이 만료된 뒤에도 접근을 막는다.
  • 널리 채택된 콘텐츠 복호화 모듈(CDM)의 라이선스를 신규 브라우저에 사실상 요구한다.
  • 우회 금지 법률의 부당한 사용을 막지 못한다.

그럼에도 사용자 에이전트가 사용자를 대신해 협상할 때 실수를 했다는 사실만으로 충성 의무를 위반한 것은 아니다. 사용자를 우선하지 않았을 때에만 의무 위반이 된다.

사용자 에이전트는 충성 의무를 저버리지 않고 서비스 요금을 받을 수 있다. 사용자가 요금 체계를 수동적으로 받아들였더라도, 예를 들어 제품에 기본 설치된 경우에도 돈을 받는다고 충성의 대상이 바뀌지는 않는다. 사용자 에이전트는 비용을 지불하는 당사자가 아니라 사용자에게 충성해야 한다.

사용자 에이전트는 사용자가 다른 사용자 에이전트로 옮기는 일을 방해해서는 안 된다. 사용자의 신원 정보, 북마크, 방문 기록, 비밀번호, 패스키 같은 자격 증명을 포함한 데이터를 접근·내보내기·저장하는 방식으로 이동성을 막아서는 안 된다. 사용자 에이전트가 자격 증명을 운영체제에 저장한다면, 사용자가 다른 사용자 에이전트도 그 자격 증명에 접근하도록 허용할 방법이 있어야 한다.

이 문서는 사용자 에이전트의 초기 정의를 제공한 Infra Standard와 의무의 초기 버전을 제공한 Privacy Principles에 감사를 전한다.