웹사이트 요청 시 보낸 사용자 에이전트와 다른 Javascript 사용자 에이전트(jax)
제 핸드폰(원플러스 3, Android 8.0.0)의 Chrome(64.0.3282.137)은 웹 페이지를 요청할 때 Ajax를 통해 요청하는 것과 대조적으로 약간 다른 사용자 에이전트를 보내는 것을 발견했습니다.
이 사용자 에이전트는 웹 페이지를 요청할 때 전송됩니다.
Mozilla/5.0 (Linux; Android 8.0.0; ONEPLUS A3003 Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36
▁this▁calling니-▁when▁user▁returned▁is▁also▁is▁making▁sent▁an▁ajax이를 호출할 때 반환됩니다.navigator.userAgent
:
Mozilla/5.0 (Linux; Android 8.0.0; Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36
차이:ONEPLUS A3003
왜 모델이 네이티브 콜에는 포함되지만 아약스 콜에는 포함되지 않는지 알 수 있을까요?
: " site" 에이전트는 다음과 같습니다.
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Safari/537.36
두 경우 모두
저는 통찰력을 얻기 위해 크롬 소스 코드를 분석했습니다.저는 c++에서 초보적인 능력으로 어느 정도의 수준에 도달할 수 있었습니다.
클라이언트 또는 플랫폼의 사용자 에이전트가 이 코드 블록(파일: useragent.cc )에서 탐지되었습니다.
std::string BuildUserAgentFromProduct(const std::string& product) {
std::string os_info;
base::StringAppendF(
&os_info,
"%s%s",
getUserAgentPlatform().c_str(),
BuildOSCpuInfo().c_str());
return BuildUserAgentFromOSAndProduct(os_info, product);
}
빌드를 볼 수 있습니다.여기에서 찾을 수 있는 플랫폼을 기반으로 실제 정보를 추가하는 작업을 처리하는 코드 블록의 OSCPUInfo()
std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename();
std::string android_device_name = base::SysInfo::HardwareModelName(); // this line in particular adds the ONEPLUS A3003
그러나 이 함수(BuildUserAgentFromProduct())는 http 요청 전송을 처리하는 넷 모듈에서 직접 사용되지 않습니다.
제가 넷(http) 모듈의 코드를 조사했을 때, 저는 그들이 일련의 문자열 조작과 화이트 스페이스 트리밍 기능을 통해 사용자 에이전트*를 얻고 그것을 처리하고 있다는 것을 알았습니다.http_request_headers.cc의 AddHeadersFromString()은 사용자 에이전트 문자열이 요청 헤더에 추가되는 인터페이스입니다.
참고*: 그러나 헤더 데이터는 useragent.cc 에서 온 것이 아닌 것 같습니다. 이 기능에 대한 호출을 어디에서도 찾을 수 없기 때문입니다.하지만 제가 틀릴 수도 있습니다.
**여기서 OSInfo의 가치가 수정되고 있다고 생각합니다.인식되지 않거나 잘못된 형식의 공백 문자는 이 결과를 제공할 수 있습니다.
참고**: 크롬에서 사용되는 문자열에는 StringPiece라는 이름으로 포장지가 둘러져 있기 때문에 위 문장을 테스트하고 증명할 수 없었습니다(*포장지는 제가 사용하는 용어일 뿐, 엄밀히 말하면 제가 모르는 다른 방식으로 부를 수 있습니다).그리고 StringPiece의 코드를 c++로 작성하는 방법을 모르겠습니다.
하지만 어떻게 잘못될 수 있는지에 대한 아주 간단한 예가 아래에 나와 있습니다.
int main()
{
std::string s = " ONEPLUS\rA3003\rBuild/OPR6.170623.013";
std::string delimiter = "\r\n"; //this is the delimeter used in chromium source code.
std::string token = s.substr(0, s.find(delimiter,0));
std::cout << token << std::endl;
return 0;
}
https://www.onlinegdb.com/SkTrbFJDz
초기 사용자 에이전트 문자열에 값이 있고 후속 http 요청에 값이 없는 이유는 안드로이드의 크롬 앱 아키텍처에 있습니다.페이지가 처음 로드될 때 값은 실제로 크롬 앱(매우 큰 자바 코드 기반)에 의해 설정됩니다. 하지만 우리가 봐야 할 핵심 파일은 LoadUrlParams.java라고 생각합니다. 이 파일은 http 요청을 보내는 다른 구현을 가지고 있습니다(여기서 사용자 에이전트는 Java Implement에 의해 관리되는 대신 동일한 net(http) 모듈에 의해 트리밍되지 않습니다).tation), 이는 첫 번째 로드 중에만 발생합니다.그러나 이후의 다른 모든 호출은 브라우저의 넷(http) 모듈을 사용합니다.
파일 참조 링크: https://cs.chromium.org/chromium/src/content/common/user_agent.cc?sq=package:chromium&dr=CSs&l=80
문제가 발생했을 수 있는 이유 중 하나를 제공하기 위해 이 답변을 포함하고 있습니다.시간이 좀 더 있다면 어떻게든 테스트를 실행할 수 있는지 알아보고 이것을 증명할 것입니다.한 가지 최종 참고: 이 답변은 문제를 해결할 수 있는 어떤 해결책도 제공하지 않습니다.그것은 단지 원인에 대한 이유를 제공할 뿐입니다.
[업데이트]
한 가지 매우 저렴한 트릭은 navigator.useragent가 onplus 값을 가지고 있는지 확인하고 요청에 Ajax 헤더를 설정하여 전송하는 것입니다.이렇게 하면 사용자 에이전트 헤더를 추가하는 브라우저의 메커니즘이 무시됩니다.
XMLHttpRequest.setRequestHeader(header, value)
번째합니다. "userAgent"는 userAgent와 userAgent를 구분합니다.ONEPLUS A3003
그러나 두 번째 w3 사양(여기서 찾기)에서는 userAgent를 수정할 수 없으므로,ONEPLUS A3003
.
데스크톱 사이트 요청 기능을 사용할 때 브라우저에서 userAgent를 수정할 필요가 없으므로 동일한 userAgent가 표시됩니다.
참고: 해당 Chrome 브라우저의 기본 userAgent는 다음과 같습니다.Mozilla/5.0 (Linux; Android 8.0.0; Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36
언급URL : https://stackoverflow.com/questions/47904396/javascript-user-agent-ajax-different-to-sent-user-agent-when-requesting-websit
'programing' 카테고리의 다른 글
jQuery Validate - 그룹에 하나 이상의 필드를 채워야 합니다. (0) | 2023.08.30 |
---|---|
AJAX 호출 중 JS 변수 이름 끝에 있는 대괄호를 제거하려면 어떻게 해야 합니까? (0) | 2023.08.30 |
파일 업로드 컨트롤을 사용하여 파일의 전체 경로 가져오기 (0) | 2023.08.30 |
JQuery - 값으로 라디오 버튼 찾기 (0) | 2023.08.30 |
jquery Ajax 요청을 사용하여 시도/캐치 (0) | 2023.08.30 |