[javascript] 웹 사이트를 방문하는 컴퓨터를 어떻게 고유하게 식별합니까?

만들고있는 웹 사이트를 방문하는 각 컴퓨터를 고유하게 식별하는 방법을 찾아야합니다. 아무도 이것을 달성하는 방법에 대한 조언이 있습니까?

솔루션이 모든 컴퓨터와 모든 브라우저에서 작동하기를 원하기 때문에 (이유 내에서) javascript를 사용하여 솔루션을 만들려고합니다.

쿠키는하지 않습니다.

컴퓨터에 하드웨어 변경이 발생하지 않았다고 가정 할 때 기본적으로 컴퓨터에 고유하고 반복 가능한 guid를 만들 수 있어야합니다. 내가 생각하는 방향은 웹 사이트를 방문하는 컴퓨터를 식별하는 네트워크 카드의 MAC 및 이러한 특성의 다른 정보를 얻는 것입니다.



답변

이 사람들은 사용자를 높은 정확도로 인식 할 수있는 지문 인식 방법을 개발했습니다.

https://panopticlick.eff.org/static/browser-uniqueness.pdf

최신 웹 브라우저가 요청시 웹 사이트로 전송할 버전 및 구성 정보를 통해 “장치 지문”에 적용되는 정도를 조사합니다. 가능한 지문 인식 알고리즘 하나를 구현하고 테스트 측인 panopticlick.eff.org 를 방문한 대규모 브라우저 샘플에서 이러한 지문을 수집했습니다.
. 우리는 지문 분포에 최소한 18.1 비트의 엔트로피가 포함되어 있음을 관찰합니다. 즉, 브라우저를 임의로 선택하면 286,777 명의 다른 브라우저 중 하나만 지문을 공유 할 것으로 예상됩니다. Flash 또는 Java를 지원하는 브라우저 중에서 상황이 더 나 빠지고 일반 브라우저는 18.8 비트 이상의 식별 정보를 가지고 있습니다. Flash 또는 Java를 사용하는 브라우저의 94.2 %가 샘플에서 독특했습니다.

재 방문자를 관찰하여 시간이 지남에 따라 브라우저 지문이 얼마나 빠르게 변경 될지 추정합니다. 이 샘플에서는 지문이 매우 빠르게 변경되었지만 간단한 휴리스틱조차도 지문이 이전에 관찰 된 브라우저 지문의 “업그레이드 된”버전인지 추측 할 수 있었으며, 99.1 %의 추측이 정확하고 오 탐률이 0.86 %에 불과했습니다. .

우리는 실제로 프라이버시 위협 브라우저 핑거 프린팅이 무엇을하는지, 그리고 그것을 막기 위해 어떤 대책이 적절한 지 논의합니다. 지문 인식에 대한 보호와 특정 종류의 디버깅 가능성 사이에는 상충 관계가 있으며, 현재 브라우저에서는 개인 정보 보호에 대한 가중치가 높습니다. 역설적으로, 지문 방지 개인 정보 보호 기술은 충분한 수의 사람들이 사용하지 않으면 스스로 패배 할 수 있습니다. 우리는 현재 일부 개인 정보 보호 조치가이 역설에 희생되고 있지만 다른 정책은 그렇지 않다는 것을 보여줍니다.


답변

소개

브라우저 만 사용하여 컴퓨터를 고유하게 식별 할 수있는 방법이 있는지 또는 없는지 모르겠습니다. 주요 이유는 다음과 같습니다.

  • 사용자 컴퓨터에 데이터를 저장해야합니다. 이 데이터는 언제든지 사용자가 삭제할 수 있습니다. 각 머신마다 고유 한이 데이터를 다시 생성 할 수있는 방법이 없다면 고착 된 것입니다.
  • 확인. 스푸핑, 세션 하이재킹 등을 방지해야합니다.

쿠키를 사용하지 않고 컴퓨터를 추적하는 방법이 있더라도이를 자동으로 수행하는 소프트웨어와 소프트웨어를 항상 우회 할 수있는 방법이 있습니다. 컴퓨터를 기반으로 무언가를 추적 해야하는 경우 기본 응용 프로그램 (Apple Store / Android Store / Windows Program 등)을 작성해야합니다.

요청한 질문에 대한 답변을 드릴 수는 없지만 세션 추적을 구현하는 방법을 보여줄 수 있습니다. 세션 추적을 사용하면 컴퓨터가 사이트를 방문하는 대신 탐색 세션을 추적하려고합니다. 세션을 추적하면 데이터베이스 스키마는 다음과 같습니다.

sesssion:
  sessionID: string
  // Global session data goes here

  computers: [{
     BrowserID: string
     ComputerID: string
     FingerprintID: string
     userID: string
     authToken: string
     ipAddresses: ["203.525....", "203.525...", ...]
     // Computer session data goes here
  }, ...]

세션 기반 추적의 장점 :

  1. 로그인 한 사용자의 경우 항상 사용자 username/ password/ 에서 동일한 세션 ID를 생성 할 수 있습니다 email.
  2. 를 사용하여 게스트 사용자를 계속 추적 할 수 있습니다 sessionID.
  3. 여러 사람이 같은 컴퓨터 (예 : 사이버 카페)를 사용하더라도 로그인하면 따로 추적 할 수 있습니다.

세션 기반 추적의 단점 :

  1. 세션은 컴퓨터 기반이 아니라 브라우저 기반입니다. 사용자가 2 개의 다른 브라우저를 사용하는 경우 2 개의 다른 세션이 발생합니다. 이것이 문제라면 여기서 읽기를 중단 할 수 있습니다.
  2. 사용자가 로그인하지 않은 경우 세션이 만료됩니다. 사용자가 로그인하지 않은 경우 사용자가 쿠키 및 브라우저 캐시를 삭제하면 무효화 된 게스트 세션을 사용합니다.

이행

이를 구현하는 방법에는 여러 가지가 있습니다. 나는 그것들을 모두 다룰 수 있다고 생각하지 않는다. 나는 이것을 좋아하는 답변으로 만들 수있는 내가 좋아하는 것을 나열 할 것이다 . 그것을 명심하십시오.

기초

나는 영원히 쿠키로 알려진 것을 사용하여 세션을 추적합니다. 사용자가 쿠키를 삭제하거나 브라우저를 업데이트하더라도 자동으로 다시 생성되는 데이터입니다. 그러나 쿠키와 브라우징 캐시를 모두 삭제해도 사용자는 생존 할 수 없습니다.

이를 구현하기 위해 브라우저 캐싱 메커니즘 ( RFC ), WebStorage API ( MDN ) 및 브라우저 쿠키 ( RFC , Google Analytics )를 사용합니다.

적법한

추적 ID를 활용하려면 개인 정보 취급 방침 및 사용 약관에 하위 제목 추적 아래에 추가해야합니다 . 우리는 모두 다음 키 사용 document.cookiewindow.localStorage:

  • _ga : Google 웹 로그 분석 데이터
  • __utma : Google 웹 로그 분석 추적 쿠키
  • sid : SessionID

추적을 사용하는 모든 페이지에 개인 정보 보호 정책 및 사용 약관에 대한 링크를 포함 시키십시오.

세션 데이터는 어디에 저장합니까?

웹 사이트 데이터베이스 나 사용자 컴퓨터에 세션 데이터를 저장할 수 있습니다. 일반적으로 타사 응용 프로그램 (Google Analytics / Clicky 등)을 사용하는 소규모 사이트 (10 만 개가 넘는 연속 연결)에서 작업하므로 클라이언트 컴퓨터에 데이터를 저장하는 것이 가장 좋습니다. 다음과 같은 장점이 있습니다.

  1. 데이터베이스 조회 / 오버 헤드 /로드 / 대기 시간 / 공간 등이 없습니다.
  2. 사용자는 나에게 성가신 이메일을 쓸 필요없이 원하는 때마다 데이터를 삭제할 수 있습니다.

그리고 단점 :

  1. 데이터는 암호화 / 암호 해독 및 서명 / 확인되어 클라이언트 (나쁘지 않은) 및 서버 (bah!)에 CPU 오버 헤드가 발생합니다.
  2. 사용자가 쿠키와 캐시를 삭제하면 데이터가 삭제됩니다. (이것이 내가 정말로 원하는 것입니다)
  3. 사용자가 오프라인 상태가되면 분석에 데이터를 사용할 수 없습니다. (현재 브라우징 사용자에 대한 분석 만)

UUIDS

  • BrowserID : 브라우저 사용자 에이전트 문자열에서 생성 된 고유 ID입니다.Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
  • ComputerID : 사용자 IP 주소 및 HTTPS 세션 키에서 생성됩니다.
    getISP(requestIP)|getHTTPSClientKey()
  • FingerPrintID : 수정 된 fingerprint.js를 기반으로하는 JavaScript 기반 지문 .FingerPrint.get()
  • SessionID : 첫 번째 사용자가 사이트를 방문 할 때 생성되는 임의의 키입니다.BrowserID|ComputerID|randombytes(256)
  • GoogleID : __utma쿠키 에서 생성됩니다 .getCookie(__utma).uniqueid

기구

다른 날 나는 여자 친구와 함께 웬디 윌리엄스 쇼 를 보고 있었고, 주최자가 시청자에게 적어도 한 달에 한 번 브라우저 기록을 삭제하도록 조언했을 때 완전히 충격을 받았습니다. 브라우저 기록을 삭제하면 일반적으로 다음과 같은 효과가 있습니다.

  1. 방문한 웹 사이트의 기록을 삭제합니다.
  2. 쿠키 및 window.localStorage(aww man)을 삭제합니다 .

대부분의 최신 브라우저에서는이 옵션을 쉽게 사용할 수 있지만 친구는 두려워하지 않습니다. 해결책이 있습니다. 브라우저에는 스크립트 / 이미지 등을 저장하는 캐싱 메커니즘이 있습니다. 일반적으로 기록을 삭제하더라도이 브라우저 캐시는 여전히 남아 있습니다. 여기에 데이터를 저장하는 방법 만 있으면됩니다. 이를 수행하는 두 가지 방법이 있습니다. SVG 이미지를 사용하고 데이터를 태그 안에 저장하는 것이 좋습니다. 이런 식으로 플래시를 사용하여 JavaScript를 비활성화 한 경우에도 데이터를 추출 할 수 있습니다. 그러나 그것은 조금 복잡하기 때문에 JSONP ( Wikipedia ) 를 사용하는 다른 접근법을 보여줄 것입니다

example.com/assets/js/tracking.js (실제 tracking.php)

var now = new Date();
var window.__sid = "SessionID"; // Server generated

setCookie("sid", window.__sid, now.setFullYear(now.getFullYear() + 1, now.getMonth(), now.getDate() - 1));

if( "localStorage" in window ) {
  window.localStorage.setItem("sid", window.__sid);
}

이제 언제든지 세션 키를 얻을 수 있습니다.

window.__sid || window.localStorage.getItem("sid") || getCookie("sid") || ""

browser.js를 브라우저에 고정시키는 방법은 무엇입니까?

Cache-Control , Last-ModifiedETag HTTP 헤더를 사용하여이를 달성 할 수 있습니다. SessionIDetag 헤더에 대해 as 값을 사용할 수 있습니다 .

setHeaders({
  "ETag": SessionID,
  "Last-Modified": new Date(0).toUTCString(),
  "Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})

Last-Modified헤더는 브라우저에이 파일이 기본적으로 수정되지 않았다고 알려줍니다. Cache-Control프록시와 게이트웨이는 문서를 캐시하지 말고 브라우저에게 1 년 동안 캐시하도록 지시합니다.

브라우저가 문서를 요청 다음에, 그것을 보낼 것입니다 If-Modified-SinceIf-None-Match헤더. 이것들을 사용하여 304 Not Modified응답 을 반환 할 수 있습니다 .

example.com/assets/js/tracking.php

$sid = getHeader("If-None-Match") ?: getHeader("if-none-match") ?: getHeader("IF-NONE-MATCH") ?: ""; 
$ifModifiedSince = hasHeader("If-Modified-Since") ?: hasHeader("if-modified-since") ?: hasHeader("IF-MODIFIED-SINCE");

if( validateSession($sid) ) {
  if( sessionExists($sid) ) {
    continueSession($sid);
    send304();
  } else {
    startSession($sid);
    send304();
  }
} else if( $ifModifiedSince ) {
  send304();
} else {
  startSession();
  send200();
}

이제 브라우저가 tracking.js우리 서버를 요청할 때마다 304 Not Modified결과에 응답하고 의 로컬 사본을 강제로 실행합니다 tracking.js.

여전히 이해가 안 돼요 나에게 설명 해줘

사용자가 인터넷 사용 기록을 지우고 페이지를 새로 고침한다고 가정하겠습니다. 사용자 컴퓨터에 남아있는 유일한 것은 tracking.js브라우저 캐시 의 사본입니다 . 브라우저가 요청할 때 응답을 tracking.js받으면 수신 304 Not Modified한 첫 번째 버전을 실행합니다 tracking.js. 삭제 된 것을 tracking.js실행하고 복원합니다 SessionID.

확인

Haxor X가 고객이 로그인 한 상태에서 쿠키를 훔쳤다고 가정합니다. 쿠키를 어떻게 보호합니까? 구조에 대한 암호화 및 브라우저 지문. 의 원래 정의 SessionID는 다음과 같습니다.

BrowserID|ComputerID|randomBytes(256)

이것을 다음과 같이 변경할 수 있습니다.

Timestamp|BrowserID|ComputerID|encrypt(randomBytes(256), hk)|sign(Timestamp|BrowserID|ComputerID|randomBytes(256), hk)

어디 hk = sign(Timestamp|BrowserID|ComputerID, serverKey).

이제 SessionID다음 알고리즘을 사용하여 유효성을 검사 할 수 있습니다 .

if( getTimestamp($sid) is older than 1 year ) return false;
if( getBrowserID($sid) !== createBrowserID($_Request, $_Server) ) return false;
if( getComputerID($sid) !== createComputerID($_Request, $_Server) return false;

$hk = sign(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid), $SERVER["key"]);

if( !verify(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid) + decrypt(getRandomBytes($sid), hk), getSignature($sid), $hk) ) return false;

return true; 

이제 Haxor의 공격이 작동하려면 다음을 수행해야합니다.

  1. 동일 ComputerID합니다. 즉, 피해자 (Tricky)와 동일한 ISP 제공 업체가 있어야합니다. 이를 통해 피해자는 자국에서 법적 조치를 취할 수 있습니다. 또한 Haxor는 피해자 (Hard)로부터 HTTPS 세션 키를 얻어야합니다.
  2. 동일 BrowserID합니다. 누구나 User-Agent 문자열을 스푸핑 할 수 있습니다 (성가신).
  3. 자신 만의 가짜 SessionID(Very Hard) 를 만들 수 있습니다 . 타임 스탬프를 사용하여 암호화 / 서명 키를 생성하므로 기본적으로 각 세션에 대해 새 키를 생성하는 것처럼 볼륨 공격이 작동하지 않습니다. 또한 임의의 바이트를 암호화하므로 간단한 사전 공격도 문제가되지 않습니다.

우리는 (아약스 또는 숨겨진 필드를 통해) 전달 GoogleID하고 FingerprintID그와 일치 시킴으로써 유효성을 향상시킬 수 있습니다 .

if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;


답변

소유자의 협조없이 웹 사이트에 액세스하는 컴퓨터를 식별 할 수 없습니다. 그러나 그들이 당신을 허용한다면, 당신은 귀하의 사이트를 다시 방문 할 때 기계를 식별하기 위해 쿠키를 저장할 수 있습니다. 열쇠는 방문자가 통제하고 있다는 것입니다. 쿠키를 제거하고 원하는 시간에 새 방문자로 표시 할 수 있습니다.


답변

가능성이 사용하는 플래시 쿠키를 :

  • 유비쿼터스 가용성 (방문객의 95 %가 플래시 일 것임)
  • 쿠키 당 더 많은 데이터를 저장할 수 있습니다 (최대 100KB)
  • 여러 브라우저에서 공유되므로 시스템을 고유하게 식별 할 가능성이 높습니다
  • 브라우저 쿠키를 지우면 플래시 쿠키는 제거되지 않습니다.

읽고 쓰는 작은 (숨겨진) 플래시 무비를 제작해야합니다.

어떤 경로를 선택하든 사용자가 추적하도록 선택해야합니다. 그렇지 않으면 개인 정보가 침해되고 나쁜 사람이됩니다.


답변

evercookie에서 고유 ID를 설정하려고 할 수 있습니다 (브라우저에서 작동하며 FAQ를 참조하십시오) :
http://samy.pl/evercookie/

이 문제를 해결하기 위해 큰 많은 회사에서 사용하는 ThreatMetrix라는 회사가있다 :
http://threatmetrix.com/our-solutions/solutions-by-product/trustdefender-id/
그들은 매우 비싸고 중 일부입니다 다른 제품은별로 좋지 않지만 장치 ID는 잘 작동합니다.

마지막으로, panopticlick 아이디어의 오픈 소스 JQuery와 구현이있다 :
https://github.com/carlo/jquery-browser-fingerprint
그것은 꽤 절반 지금 구운 보이지만 따라 확장 할 수 있습니다.

그것이 도움이되기를 바랍니다!


답변

이 과학적인 문서에서 설명하는 인기있는 방법이라고 캔버스 지문,이 웹 결코 잊어 : 야생에서 영구 추적 메커니즘 . 그것을 찾기 시작하면 얼마나 자주 사용되는지 놀랄 것입니다. 이 방법은 각 브라우저 / 하드웨어 조합에 대해 일관된 고유 한 지문을 만듭니다.

이 기사는 또한 에버 쿠키, http 및 플래시 쿠키 재 생성 및 쿠키 동기화와 같은 다른 영구 추적 방법을 검토합니다.

캔버스 핑거 프린팅에 대한 추가 정보 :


답변

HTTP 연결을 통해 얻을 수있는 소량의 정보 만 있습니다.

  1. IP-그러나 다른 사람들이 말했듯이 대부분의 인터넷 사용자는 ISP의 동적 할당 정책으로 인해 많은 인터넷 사용자에게 수정되지 않았습니다.

  2. Useragent String-거의 모든 브라우저가 요청마다 어떤 종류의 브라우저를 전송합니다. 그러나 이것은 오늘날 많은 브라우저에서 사용자가 설정할 수 있습니다.

  3. 요청 필드 수집-지원되는 인코딩 등 각 요청과 함께 전송되는 다른 필드가 있습니다. 이러한 필드는 집계에서 사용되는 경우 사용자의 컴퓨터를 식별하는 데 도움이 될 수 있지만 브라우저에 따라 다르며 변경 될 수 있습니다.

  4. 쿠키-쿠키를 설정하는 것은 컴퓨터, 특히 컴퓨터의 브라우저를 식별하는 또 다른 방법이지만 다른 사람들이 말했듯이 사용자가 삭제하거나 끌 수 있으며 브라우저에서만 적용 할 수 있습니다. 기계.

따라서 올바른 응답은 HTTP over IP 프로토콜만으로는 원하는 것을 얻을 수 없다는 것입니다. 그러나 쿠키와 IP의 조합 및 HTTP 요청의 필드를 사용하면 어떤 기계인지 추측하고 정렬 할 수 있습니다. 사용자는 하나의 브라우저를 사용하는 경향이 있으며 종종 하나의 컴퓨터에서 사용하기 때문에 상당히 신뢰할 수 있지만 청중에 따라 다를 수 있습니다. 또한 이것은 IP를 지리적 위치에 놓고 그 데이터를 사용하려는 시도와도 결합 될 수 있습니다. 그러나 어쨌든 항상 올바른 해결책은 없습니다.