소개
브라우저 만 사용하여 컴퓨터를 고유하게 식별 할 수있는 방법이 있는지 또는 없는지 모르겠습니다. 주요 이유는 다음과 같습니다.
- 사용자 컴퓨터에 데이터를 저장해야합니다. 이 데이터는 언제든지 사용자가 삭제할 수 있습니다. 각 머신마다 고유 한이 데이터를 다시 생성 할 수있는 방법이 없다면 고착 된 것입니다.
- 확인. 스푸핑, 세션 하이재킹 등을 방지해야합니다.
쿠키를 사용하지 않고 컴퓨터를 추적하는 방법이 있더라도이를 자동으로 수행하는 소프트웨어와 소프트웨어를 항상 우회 할 수있는 방법이 있습니다. 컴퓨터를 기반으로 무언가를 추적 해야하는 경우 기본 응용 프로그램 (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
}, ...]
세션 기반 추적의 장점 :
- 로그인 한 사용자의 경우 항상 사용자
username
/ password
/ 에서 동일한 세션 ID를 생성 할 수 있습니다 email
.
- 를 사용하여 게스트 사용자를 계속 추적 할 수 있습니다
sessionID
.
- 여러 사람이 같은 컴퓨터 (예 : 사이버 카페)를 사용하더라도 로그인하면 따로 추적 할 수 있습니다.
세션 기반 추적의 단점 :
- 세션은 컴퓨터 기반이 아니라 브라우저 기반입니다. 사용자가 2 개의 다른 브라우저를 사용하는 경우 2 개의 다른 세션이 발생합니다. 이것이 문제라면 여기서 읽기를 중단 할 수 있습니다.
- 사용자가 로그인하지 않은 경우 세션이 만료됩니다. 사용자가 로그인하지 않은 경우 사용자가 쿠키 및 브라우저 캐시를 삭제하면 무효화 된 게스트 세션을 사용합니다.
이행
이를 구현하는 방법에는 여러 가지가 있습니다. 나는 그것들을 모두 다룰 수 있다고 생각하지 않는다. 나는 이것을 좋아하는 답변으로 만들 수있는 내가 좋아하는 것을 나열 할 것이다 . 그것을 명심하십시오.
기초
나는 영원히 쿠키로 알려진 것을 사용하여 세션을 추적합니다. 사용자가 쿠키를 삭제하거나 브라우저를 업데이트하더라도 자동으로 다시 생성되는 데이터입니다. 그러나 쿠키와 브라우징 캐시를 모두 삭제해도 사용자는 생존 할 수 없습니다.
이를 구현하기 위해 브라우저 캐싱 메커니즘 ( RFC ), WebStorage API ( MDN ) 및 브라우저 쿠키 ( RFC , Google Analytics )를 사용합니다.
적법한
추적 ID를 활용하려면 개인 정보 취급 방침 및 사용 약관에 하위 제목 추적 아래에 추가해야합니다 . 우리는 모두 다음 키 사용 document.cookie
과 window.localStorage
:
- _ga : Google 웹 로그 분석 데이터
- __utma : Google 웹 로그 분석 추적 쿠키
- sid : SessionID
추적을 사용하는 모든 페이지에 개인 정보 보호 정책 및 사용 약관에 대한 링크를 포함 시키십시오.
세션 데이터는 어디에 저장합니까?
웹 사이트 데이터베이스 나 사용자 컴퓨터에 세션 데이터를 저장할 수 있습니다. 일반적으로 타사 응용 프로그램 (Google Analytics / Clicky 등)을 사용하는 소규모 사이트 (10 만 개가 넘는 연속 연결)에서 작업하므로 클라이언트 컴퓨터에 데이터를 저장하는 것이 가장 좋습니다. 다음과 같은 장점이 있습니다.
- 데이터베이스 조회 / 오버 헤드 /로드 / 대기 시간 / 공간 등이 없습니다.
- 사용자는 나에게 성가신 이메일을 쓸 필요없이 원하는 때마다 데이터를 삭제할 수 있습니다.
그리고 단점 :
- 데이터는 암호화 / 암호 해독 및 서명 / 확인되어 클라이언트 (나쁘지 않은) 및 서버 (bah!)에 CPU 오버 헤드가 발생합니다.
- 사용자가 쿠키와 캐시를 삭제하면 데이터가 삭제됩니다. (이것이 내가 정말로 원하는 것입니다)
- 사용자가 오프라인 상태가되면 분석에 데이터를 사용할 수 없습니다. (현재 브라우징 사용자에 대한 분석 만)
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
기구
다른 날 나는 여자 친구와 함께 웬디 윌리엄스 쇼 를 보고 있었고, 주최자가 시청자에게 적어도 한 달에 한 번 브라우저 기록을 삭제하도록 조언했을 때 완전히 충격을 받았습니다. 브라우저 기록을 삭제하면 일반적으로 다음과 같은 효과가 있습니다.
- 방문한 웹 사이트의 기록을 삭제합니다.
- 쿠키 및
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-Modified 및 ETag HTTP 헤더를 사용하여이를 달성 할 수 있습니다. SessionID
etag 헤더에 대해 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-Since
및 If-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의 공격이 작동하려면 다음을 수행해야합니다.
- 동일
ComputerID
합니다. 즉, 피해자 (Tricky)와 동일한 ISP 제공 업체가 있어야합니다. 이를 통해 피해자는 자국에서 법적 조치를 취할 수 있습니다. 또한 Haxor는 피해자 (Hard)로부터 HTTPS 세션 키를 얻어야합니다.
- 동일
BrowserID
합니다. 누구나 User-Agent 문자열을 스푸핑 할 수 있습니다 (성가신).
- 자신 만의 가짜
SessionID
(Very Hard) 를 만들 수 있습니다 . 타임 스탬프를 사용하여 암호화 / 서명 키를 생성하므로 기본적으로 각 세션에 대해 새 키를 생성하는 것처럼 볼륨 공격이 작동하지 않습니다. 또한 임의의 바이트를 암호화하므로 간단한 사전 공격도 문제가되지 않습니다.
우리는 (아약스 또는 숨겨진 필드를 통해) 전달 GoogleID
하고 FingerprintID
그와 일치 시킴으로써 유효성을 향상시킬 수 있습니다 .
if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;