PHP 애플리케이션이 Alice와 Bob에게 서비스를 제공하며, 두 사람 모두 서버 측 cURL 클라이언트를 사용해 프록시를 거쳐 같은 원격 웹사이트에 도달합니다. 모든 요청이 cookies.txt을 불러오면 두 사용자가 같은 원격 로그인을 물려받을 수 있습니다. 프록시 주소를 바꾸는 것만으로는 그 파일이 분리되지 않습니다.

파일 이름을 정하기 전에 쿠키의 주인을 정하십시오. 보통은 애플리케이션의 논리적 원격 세션입니다: 로컬 사용자, 특정 원격 계정, 필요하다면 별도의 작업 공간입니다. 프록시 엔드포인트는 경로 선택이지 신뢰할 수 있는 세션 식별자가 아닙니다. 여러 사용자가 하나의 엔드포인트를 공유할 수 있고, 엔드포인트는 출구를 바꿀 수 있습니다.

같은 세션의 항아리를 불러오고 저장하기

애플리케이션이 인증된 세션을 서버가 생성한 파일 키에 매핑하도록 하십시오. 비공개 쿠키 디렉터리와 신뢰할 수 있는 $sessionKey이 있으면 cURL 구성은 이런 모양입니다.

$jar = $cookieDirectory . '/' . $sessionKey . '.cookies';

$ch = curl_init('https://service.example.net/account');
curl_setopt_array($ch, [
    CURLOPT_PROXY => 'http://proxy.example.net:8080',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEFILE => $jar,
    CURLOPT_COOKIEJAR => $jar,
]);

공용 중개자를 허용하는 네트워크에서 허가된 공개 사이트 세션 테스트에는 HTTP 프록시 목록이 후보 엔드포인트를 제공합니다. 프록시 인증이 설정되지 않았거나 프록시 자격 증명을 보관하지 않은 핸들을 사용하고, 쿠키 상태는 의도한 세션에 배정된 채로 두십시오. 이 조각은 핸들을 구성할 뿐입니다. 애플리케이션이 전송을 수행하고 평소의 요청 흐름으로 결과를 확인합니다. COOKIEFILE은 세션의 이전 쿠키를 불러옵니다. COOKIEJAR는 핸들이 보관된 쿠키를 쓸 위치를 정합니다. 출력 파일만 설정하면 이전 로그인이 불러와지지 않습니다.

새 세션은 파일 없이 시작할 수 있습니다. 첫 전송에 의도한 항아리 경로를 주고, 웹사이트가 쿠키를 세우게 한 뒤, 생긴 상태를 다음 요청을 위해 저장하십시오. 쿠키 디렉터리는 애플리케이션 작업자가 쓸 수 있어야 하고 공개적으로 제공되는 문서 트리 밖에 있어야 합니다. 방문자가 제공한 사용자 이름이나 경로를 파일 이름으로 바꾸지 마십시오. 신뢰할 수 있는 키는 서버에서 조회하십시오.

저장에는 요청 수명 주기 안의 자리가 필요하다

libcurl은 보통 핸들을 정리할 때 항아리를 씁니다. 원격 교환 뒤에 명시적 저장 지점이 필요하면 애플리케이션은 이렇게 요청할 수 있습니다.

curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');

이것은 핸들이 현재 알고 있는 쿠키를 구성된 항아리에 씁니다. 그 세션에 대한 핸들 사용을 끝낸 뒤 관련 없는 작업에 배정하십시오. 이미 Alice의 쿠키를 담고 있는 핸들에서 항아리 경로만 바꾸는 것은 Bob의 깨끗한 세션을 만드는 것과 같지 않습니다.

성공한 다운로드와 성공한 지속성도 구분하십시오. 쿠키 항아리 문서는 정리 중의 쓰기 실패가 일반 전송 오류로 반환되지 않는다고 밝힙니다. 로그인이 한 요청에서는 되고 다음 요청에서 사라진다면 디렉터리 소유권, 권한, 애플리케이션의 진단 출력을 확인하십시오.

동시 요청은 또 다른 경계를 만듭니다. 두 작업자가 같은 오래된 항아리를 불러와 각자 메모리 상태를 바꾼 뒤 서로 다른 결과를 저장할 수 있습니다. 두 요청이 하나의 원격 로그인을 공유한다면 세션별 잠금이나 이에 준하는 직렬화가 불러오기, 교환, 저장의 전 과정을 덮어야 합니다. 마지막 쓰기만 잠그는 것으로는 앞선 스냅숏이 조화되지 않습니다. 서로 다른 세션은 서로 다른 파일과 독립된 잠금을 가져야 합니다.

로그아웃할 때는 의도한 원격 세션을 끝내고 애플리케이션 정책에 따라 그 로컬 쿠키 상태를 폐기하십시오. 그러면 새로 고른 프록시를 사용자가 시작하는 어떤 새 세션에도 붙일 수 있고, 프록시 주소가 누구의 로그인이 메모리에 있는지 결정하지 않게 됩니다.

관련 글