Overview

참고: 이 문서는 현재 개발 중입니다. 조만간 개선될 예정입니다.

Google 세이프 브라우징 v5는 Google 세이프 브라우징 v4의 발전된 버전입니다. v5에서 이루어진 두 가지 주요 변경사항은 데이터 최신성 및 IP 개인 정보 보호입니다. 또한 유연성과 효율성을 높이고 불필요한 확장을 줄이기 위해 API 노출 영역이 개선되었습니다. 또한 Google 세이프 브라우징 v5는 v4에서 이전할 수 있도록 설계되었습니다.

현재 Google에서는 v4와 v5를 모두 제공하며 둘 다 프로덕션 준비가 완료된 것으로 간주됩니다. v4 또는 v5를 사용할 수 있습니다. v4 지원 종료 날짜는 아직 발표되지 않았습니다. 발표되는 경우 최소 1년 전에 알려드릴 예정입니다. 이 페이지에서는 v5와 v4에서 v5로의 이전 가이드를 설명합니다. 전체 v4 문서는 계속 사용할 수 있습니다.

데이터 최신 상태

v5에서는 실시간 보호라는 작동 모드를 도입합니다. 이렇게 하면 위의 데이터 비활성 문제는 방지됩니다. v4에서는 클라이언트가 로컬 데이터베이스를 다운로드하고 유지 관리하고, 로컬에서 다운로드한 위협 목록을 확인한 후 부분 프리픽스 일치가 있는 경우 전체 해시를 다운로드하기 위한 요청을 실행해야 합니다. v5에서는 클라이언트가 계속해서 위협 목록의 로컬 데이터베이스를 다운로드하고 유지해야 하지만, 이제 클라이언트는 양호할 가능성이 높은 사이트 목록 (전역 캐시라고 함)도 다운로드하고 이 전역 캐시의 로컬 확인과 로컬 위협 목록 확인을 모두 실행해야 합니다. 마지막으로 위협 목록의 일부 접두사가 일치하거나 전역 캐시에서 일치하지 않는 경우 전체 해시를 다운로드하기 위한 요청을 실행합니다. (클라이언트에서 필요한 로컬 처리에 관한 자세한 내용은 아래에 제공된 절차를 참고하세요.) 이는 기본적으로 허용에서 기본적으로 확인으로 전환되었음을 나타내며, 이는 웹에서 위협이 더 빠르게 확산되는 점을 고려하여 보호를 개선할 수 있습니다. 즉, 이 프로토콜은 거의 실시간으로 보호 기능을 제공하도록 설계되었습니다. Google은 클라이언트가 최신 Google 세이프 브라우징 데이터의 이점을 누릴 수 있도록 하기 위해 노력하고 있습니다.

IP 개인 정보 보호

Google 세이프 브라우징 (v4 또는 v5)은 요청을 게재하는 과정에서 사용자 ID와 관련된 어떠한 항목도 처리하지 않습니다. 전송된 쿠키는 무시됩니다. 요청의 출발 IP 주소는 Google에 알려져 있지만 Google은 필수적인 네트워킹 요구사항 (예: 응답 전송) 및 DoS 방지 목적으로만 IP 주소를 사용합니다.

v5와 동시에 세이프 브라우징 Oblivious HTTP Gateway API라는 호환 API가 도입됩니다. 이 방법에서는 Oblivious HTTP를 사용하여 Google에서 최종 사용자의 IP 주소를 숨깁니다. 이는 공모하지 않는 서드 파티가 암호화된 버전의 사용자 요청을 처리한 후 Google에 전달하는 방식으로 작동합니다. 따라서 서드 파티는 IP 주소에만 액세스할 수 있고 Google은 요청 콘텐츠에만 액세스할 수 있습니다. 서드 파티는 Oblivious HTTP 릴레이 (예: Fastly의 이 서비스)를 운영하고 Google은 Oblivious HTTP 게이트웨이를 운영합니다. 이 API는 선택사항입니다. Google 세이프 브라우징과 함께 사용하면 최종 사용자의 IP 주소가 더 이상 Google에 전송되지 않습니다.

작동 모드

Google 세이프 브라우징 v5를 사용하면 클라이언트가 세 가지 작동 모드 중에서 선택할 수 있습니다.

실시간 모드

클라이언트가 실시간 모드에서 Google 세이프 브라우징 v5를 사용하도록 선택하면 클라이언트는 로컬 데이터베이스에 (i) 호스트 접미사/경로 접두사 URL 표현식의 SHA256 해시 형식의 무해할 가능성이 높은 사이트의 글로벌 캐시, (ii) 호스트 접미사/경로 접두사 URL 표현식의 SHA256 해시 접두사 형식의 위협 목록 집합을 유지합니다. 대략적인 개념은 클라이언트가 특정 URL을 확인하려고 할 때마다 전역 캐시를 사용하여 로컬 확인이 실행된다는 것입니다. 이 검사가 통과하면 로컬 위협 목록 검사가 실행됩니다. 그렇지 않으면 클라이언트는 아래에 설명된 대로 실시간 해시 검사를 계속 진행합니다.

클라이언트는 로컬 데이터베이스 외에도 로컬 캐시를 유지합니다. 이러한 로컬 캐시는 영구 저장소에 있을 필요가 없으며 메모리 부족이 발생하면 삭제될 수 있습니다.

절차에 관한 자세한 사양은 아래를 참고하세요.

로컬 목록 모드

클라이언트가 이 모드에서 Google Safe Browsing v5를 사용하도록 선택하면 클라이언트 동작은 v5의 향상된 API 노출 영역을 사용하는 점을 제외하고 v4 Update API와 유사합니다. 클라이언트는 호스트 접미사/경로 접두사 URL 표현식의 SHA256 해시 접두사로 형식이 지정된 일련의 위협 목록을 로컬 데이터베이스에 유지합니다. 클라이언트가 특정 URL을 확인하려고 할 때마다 로컬 위협 목록을 사용하여 확인이 실행됩니다. 일치하는 항목이 있는 경우에만 클라이언트가 서버에 연결하여 확인을 계속합니다.

위와 마찬가지로 클라이언트는 영구 스토리지에 있을 필요가 없는 로컬 캐시도 유지합니다.

저장소가 없는 실시간 모드

클라이언트가 스토리지가 없는 실시간 모드에서 Google 세이프 브라우징 v5를 사용하도록 선택하는 경우 클라이언트는 영구 로컬 데이터베이스를 유지할 필요가 없습니다. 하지만 클라이언트는 여전히 로컬 캐시를 유지해야 합니다. 이러한 로컬 캐시는 영구 저장소에 있을 필요가 없으며 메모리 부족이 발생하면 삭제될 수 있습니다.

클라이언트가 특정 URL을 확인하려고 할 때마다 항상 서버에 연결하여 확인을 실행합니다. 이 모드는 v4 Lookup API의 클라이언트가 구현할 수 있는 것과 유사합니다.

실시간 모드에 비해 이 모드는 더 많은 네트워크 대역폭을 사용할 수 있지만 클라이언트가 영구 로컬 상태를 유지하는 것이 불편한 경우 더 적합할 수 있습니다.

실시간 URL 확인 절차

이 절차는 클라이언트가 실시간 작동 모드를 선택할 때 사용됩니다.

이 절차는 단일 URL u을 사용하고 SAFE, UNSAFE 또는 UNSURE을 반환합니다. SAFE를 반환하면 Google 세이프 브라우징에서 URL을 안전한 것으로 간주합니다. UNSAFE이 반환되면 Google 세이프 브라우징에서 URL이 잠재적으로 안전하지 않다고 간주하므로 최종 사용자에게 경고를 표시하거나, 수신된 메일을 스팸 폴더로 이동하거나, 계속하기 전에 사용자의 추가 확인을 요구하는 등 적절한 조치를 취해야 합니다. UNSURE를 반환하면 나중에 다음 로컬 검사 절차를 사용해야 합니다.

  1. expressions은 URL u에 의해 생성된 접미사/접두사 표현식의 목록입니다.
  2. expressionHashes를 목록으로 가정하고, 여기서 요소는 expressions의 각 표현식의 SHA256 해시입니다.
  3. expressionHashes의 각 hash에 대해 다음을 실행합니다.
    1. 전역 캐시에서 hash를 찾을 수 있으면 UNSURE를 반환합니다.
  4. expressionHashPrefixes를 목록으로 가정하고, 여기서 요소는 expressionHashes의 각 해시의 처음 4바이트입니다.
  5. expressionHashPrefixes의 각 expressionHashPrefix에 대해 다음을 실행합니다.
    1. 로컬 캐시에서 expressionHashPrefix를 조회합니다.
    2. 캐시된 항목이 있는 경우 다음을 실행합니다.
      1. 현재 시간이 만료 시간보다 큰지 확인합니다.
      2. 더 큰 경우:
        1. 찾은 캐시된 항목을 로컬 캐시에서 삭제합니다.
        2. 루프를 계속 진행합니다.
      3. 더 크지 않은 경우:
        1. expressionHashPrefixes에서 이 특정 expressionHashPrefix를 삭제합니다.
        2. expressionHashes 내의 상응하는 전체 해시가 캐시된 항목에 있는지 확인합니다.
        3. 찾은 경우 UNSAFE을 반환합니다.
        4. 찾을 수 없는 경우 루프를 계속 진행합니다.
    3. 캐시된 항목을 찾을 수 없는 경우 루프를 계속 진행합니다.
  6. RPC SearchHashes 또는 REST 메서드 hashes.search를 사용하여 Google 세이프 브라우징 v5 서버에 expressionHashPrefixes를 전송합니다. 오류가 발생한 경우 (네트워크 오류, HTTP 오류 등) UNSURE를 반환합니다. 그렇지 않으면 응답을 SB 서버에서 수신한 response로 설정합니다. response는 전체 해시 목록과 함께 위협의 성격 (소셜 엔지니어링, 멀웨어 등)을 식별하는 보조 정보, 캐시 만료 시간 expiration으로 구성됩니다.
  7. response의 각 fullHash에 대해 다음을 실행합니다.
    1. fullHashexpiration와 함께 로컬 캐시에 삽입합니다.
  8. response의 각 fullHash에 대해 다음을 실행합니다.
    1. isFoundexpressionHashes에서 fullHash를 찾은 결과입니다.
    2. isFound가 False이면 루프를 계속 진행합니다.
    3. isFound이 true인 경우 UNSAFE를 반환합니다.
  9. SAFE를 반환합니다.

이 프로토콜은 클라이언트가 expressionHashPrefixes를 서버로 전송하는 시점을 지정하지만, 전송하는 방법은 의도적으로 정확하게 지정하지 않습니다. 예를 들어 클라이언트가 단일 요청으로 모든 expressionHashPrefixes를 전송하는 것이 허용되며, 클라이언트가 expressionHashPrefixes의 각 개별 접두사를 별도의 요청으로 서버에 전송하는 것도 허용됩니다 (동시에 진행될 수 있음). 단일 요청에 전송되는 해시 접두사 수가 30개를 초과하지 않는 한 클라이언트가 expressionHashPrefixes의 해시 접두사와 함께 관련 없는 해시 접두사 또는 무작위로 생성된 해시 접두사를 전송하는 것도 허용됩니다.

LocalThreat 목록 URL 확인 절차

이 절차는 클라이언트가 로컬 목록 작업 모드를 선택하는 경우에 사용됩니다. 위의 RealTimeCheck 프로시저 클라이언트가 UNSURE 값을 반환할 때도 사용됩니다.

이 절차는 단일 URL u을 사용하고 SAFE 또는 UNSAFE을 반환합니다.

  1. expressions은 URL u에 의해 생성된 접미사/접두사 표현식의 목록입니다.
  2. expressionHashes를 목록으로 가정하고, 여기서 요소는 expressions의 각 표현식의 SHA256 해시입니다.
  3. expressionHashPrefixes를 목록으로 가정하고, 여기서 요소는 expressionHashes의 각 해시의 처음 4바이트입니다.
  4. expressionHashPrefixes의 각 expressionHashPrefix에 대해 다음을 실행합니다.
    1. 로컬 캐시에서 expressionHashPrefix를 조회합니다.
    2. 캐시된 항목이 있는 경우 다음을 실행합니다.
      1. 현재 시간이 만료 시간보다 큰지 확인합니다.
      2. 더 큰 경우:
        1. 찾은 캐시된 항목을 로컬 캐시에서 삭제합니다.
        2. 루프를 계속 진행합니다.
      3. 더 크지 않은 경우:
        1. expressionHashPrefixes에서 이 특정 expressionHashPrefix를 삭제합니다.
        2. expressionHashes 내의 상응하는 전체 해시가 캐시된 항목에 있는지 확인합니다.
        3. 찾은 경우 UNSAFE을 반환합니다.
        4. 찾을 수 없는 경우 루프를 계속 진행합니다.
    3. 캐시된 항목을 찾을 수 없는 경우 루프를 계속 진행합니다.
  5. expressionHashPrefixes의 각 expressionHashPrefix에 대해 다음을 실행합니다.
    1. 로컬 위협 목록 데이터베이스에서 expressionHashPrefix를 조회합니다.
    2. 로컬 위협 목록 데이터베이스에서 expressionHashPrefix를 찾을 수 없는 경우 expressionHashPrefixes에서 삭제합니다.
  6. RPC SearchHashes 또는 REST 메서드 hashes.search를 사용하여 Google 세이프 브라우징 v5 서버에 expressionHashPrefixes를 전송합니다. 오류가 발생한 경우 (네트워크 오류, HTTP 오류 등) SAFE를 반환합니다. 그렇지 않으면 응답을 SB 서버에서 수신한 response로 설정합니다. response는 전체 해시 목록과 함께 위협의 성격 (소셜 엔지니어링, 멀웨어 등)을 식별하는 보조 정보, 캐시 만료 시간 expiration으로 구성됩니다.
  7. response의 각 fullHash에 대해 다음을 실행합니다.
    1. fullHashexpiration와 함께 로컬 캐시에 삽입합니다.
  8. response의 각 fullHash에 대해 다음을 실행합니다.
    1. isFoundexpressionHashes에서 fullHash를 찾은 결과입니다.
    2. isFound가 False이면 루프를 계속 진행합니다.
    3. isFound이 true인 경우 UNSAFE를 반환합니다.
  9. SAFE를 반환합니다.

로컬 데이터베이스가 없는 실시간 URL 확인 절차

이 절차는 클라이언트가 저장소가 없는 실시간 작동 모드를 선택하는 경우에 사용됩니다.

이 절차는 단일 URL u을 사용하고 SAFE 또는 UNSAFE를 반환합니다.

  1. expressions은 URL u에 의해 생성된 접미사/접두사 표현식의 목록입니다.
  2. expressionHashes를 목록으로 가정하고, 여기서 요소는 expressions의 각 표현식의 SHA256 해시입니다.
  3. expressionHashPrefixes를 목록으로 가정하고, 여기서 요소는 expressionHashes의 각 해시의 처음 4바이트입니다.
  4. expressionHashPrefixes의 각 expressionHashPrefix에 대해 다음을 실행합니다.
    1. 로컬 캐시에서 expressionHashPrefix를 조회합니다.
    2. 캐시된 항목이 있는 경우 다음을 실행합니다.
      1. 현재 시간이 만료 시간보다 큰지 확인합니다.
      2. 더 큰 경우:
        1. 찾은 캐시된 항목을 로컬 캐시에서 삭제합니다.
        2. 루프를 계속 진행합니다.
      3. 더 크지 않은 경우:
        1. expressionHashPrefixes에서 이 특정 expressionHashPrefix를 삭제합니다.
        2. expressionHashes 내의 상응하는 전체 해시가 캐시된 항목에 있는지 확인합니다.
        3. 찾은 경우 UNSAFE을 반환합니다.
        4. 찾을 수 없는 경우 루프를 계속 진행합니다.
    3. 캐시된 항목을 찾을 수 없는 경우 루프를 계속 진행합니다.
  5. RPC SearchHashes 또는 REST 메서드 hashes.search를 사용하여 Google 세이프 브라우징 v5 서버에 expressionHashPrefixes를 전송합니다. 오류가 발생한 경우 (네트워크 오류, HTTP 오류 등) SAFE를 반환합니다. 그렇지 않으면 응답을 SB 서버에서 수신한 response로 설정합니다. response는 전체 해시 목록과 함께 위협의 성격 (소셜 엔지니어링, 멀웨어 등)을 식별하는 보조 정보, 캐시 만료 시간 expiration으로 구성됩니다.
  6. response의 각 fullHash에 대해 다음을 실행합니다.
    1. fullHashexpiration와 함께 로컬 캐시에 삽입합니다.
  7. response의 각 fullHash에 대해 다음을 실행합니다.
    1. isFoundexpressionHashes에서 fullHash를 찾은 결과입니다.
    2. isFound가 False이면 루프를 계속 진행합니다.
    3. isFound이 true인 경우 UNSAFE를 반환합니다.
  8. SAFE를 반환합니다.

실시간 URL 확인 절차와 마찬가지로 이 절차에서는 해시 접두사를 서버로 전송하는 방법을 정확하게 지정하지 않습니다. 예를 들어 클라이언트가 단일 요청으로 모든 expressionHashPrefixes를 전송하는 것이 허용되며, 클라이언트가 expressionHashPrefixes의 각 개별 접두사를 별도의 요청으로 서버에 전송하는 것도 허용됩니다 (동시에 진행될 수 있음). 단일 요청에 전송되는 해시 접두사 수가 30개를 초과하지 않는 한 클라이언트가 expressionHashPrefixes의 해시 접두사와 함께 관련 없는 해시 접두사 또는 무작위로 생성된 해시 접두사를 전송하는 것도 허용됩니다.

예시 요청

이 섹션에서는 HTTP API를 직접 사용하여 Google 세이프 브라우징에 액세스하는 몇 가지 예시를 설명합니다. 생성된 언어 바인딩은 편리한 방식으로 인코딩과 디코딩을 자동으로 처리하므로 일반적으로 사용하는 것이 좋습니다. 해당 바인딩의 문서를 참고하세요.

다음은 hashes.search 메서드를 사용하는 HTTP 요청의 예입니다.

GET https://safebrowsing.googleapis.com/v5/hashes:search?key=INSERT_YOUR_API_KEY_HERE&hashPrefixes=WwuJdQ

응답 본문은 프로토콜 버퍼 형식의 페이로드이며, 이를 디코딩할 수 있습니다.

다음은 hashLists.batchGet 메서드를 사용하는 HTTP 요청의 예입니다.

GET https://safebrowsing.googleapis.com/v5alpha1/hashLists:batchGet?key=INSERT_YOUR_API_KEY_HERE&names=se&names=mw-4b

응답 본문은 다시 한번 프로토콜 버퍼 형식의 페이로드이며, 이 페이로드를 디코딩할 수 있습니다.