개요
PHP의 https:// 및 https:// 래퍼(wrapper)는 HTTP 프로토콜을 통해 원격 리소스와 파일에 접근할 수 있게 해주는 스트림 래퍼입니다. 다만 이 래퍼는 읽기 전용(read-only)으로만 동작하며, 파일 쓰기나 복사 기능은 지원하지 않습니다.
가상 호스트(virtual name-based host) 환경에서 요청을 처리할 때는 host: 헤더가 전송되며, php.ini에서 user_agent가 설정되어 있다면 해당 값도 함께 서버로 전달됩니다.
응답과 함께 받은 HTTP 헤더 정보는 $http_response_header 변수에 자동으로 저장됩니다. 이 헤더들을 분석하면 from: 헤더 등을 통해 문서가 실제로 어떤 URL의 리소스에서 가져온 것인지 확인할 수 있습니다.
HTTPS 연결을 사용하려면 php.ini 설정에서 openssl 확장이 반드시 활성화되어 있어야 합니다. HTTP와 HTTPS 모두 읽기 전용이므로 원격 파일에 데이터를 쓰거나 복사하는 작업은 불가능하다는 점을 유의해야 합니다.
사용 방법
래퍼를 통해 파일 이름(URL)을 표현하는 대표적인 방식은 다음과 같습니다.
https://localhost https://example.com https://localhost?name='Ram'&age=20 https://example.com https://username:password@abc.com
위 예시처럼 로컬 호스트, 일반 도메인, 쿼리 문자열이 포함된 URL, HTTPS 주소, 그리고 인증 정보(아이디:비밀번호)가 포함된 URL까지 다양한 형태로 지정할 수 있습니다.
실전 예제
다음 예제는 fopen()으로 원격 URL을 열고, stream_get_meta_data() 함수를 사용해 스트림의 메타데이터(HTTP 헤더 포함)를 읽어오는 방법을 보여줍니다.
<?php
$url = 'https://www.tutorialspoint.com/php7/php7_closure_call.htm';
if (!$fp = fopen($url, 'r')) {
trigger_error("Unable to open URL ($url)", E_USER_ERROR);
}
$meta = stream_get_meta_data($fp);
print_r($meta);
?>위 스크립트를 실행하면 HTTP(S) URL에서 헤더 메타데이터를 읽어 배열 형태로 출력합니다.
Array(
[crypto] => Array(
[protocol] => TLSv1.2
[cipher_name] => ECDHE-RSA-AES128-GCM-SHA256
[cipher_bits] => 128
[cipher_version] => TLSv1/SSLv3
)
[timed_out] =>
[blocked] => 1
[eof] =>
[wrapper_data] => Array(
[0] => HTTP/1.0 200 OK
[1] => Age: 1310067
[2] => Cache-Control: max-age=2592000
[3] => Content-Type: text/html; charset=UTF-8
[4] => Date: Mon, 14 Sep 2020 17:15:36 GMT
[5] => Expires: Wed, 14 Oct 2020 17:15:36 GMT
[6] => Last-Modified: Sun, 30 Aug 2020 13:21:09 GMT
[7] => Server: ECS (nag/99AA)
[8] => Strict-Transport-Security: max-age=63072000; includeSubdomains
[9] => Vary: Accept-Encoding
[10] => X-Cache: HIT
[11] => X-Content-Type-Options: nosniff
[12] => X-Frame-Options: SAMEORIGIN
[13] => X-XSS-Protection: 1; mode=block
[14] => Content-Length: 24102
[15] => Connection: close
)
[wrapper_type] => http
[stream_type] => tcp_socket/ssl
[mode] => r
[unread_bytes] => 0
[seekable] =>
[uri] => https://www.tutorialspoint.com/php7/php7_closure_call.htm
)출력 결과 해석
- crypto: 사용된 TLS 프로토콜 버전(TLSv1.2), 암호화 방식(ECDHE-RSA-AES128-GCM-SHA256) 등 보안 연결 정보를 담고 있습니다.
- wrapper_data: 서버가 반환한 실제 HTTP 응답 헤더 목록입니다. 상태 코드(200 OK), 캐시 정책, 콘텐츠 타입, 콘텐츠 길이 등을 확인할 수 있습니다.
- wrapper_type / stream_type: 각각 래퍼 유형(http)과 스트림 유형(tcp_socket/ssl)을 나타냅니다.
- uri: 실제로 접속한 원격 자원의 주소입니다.
이처럼 PHP의 http/https 래퍼를 활용하면 별도의 cURL 설정 없이도 간단히 원격 웹 자원을 읽어오고, 응답 헤더 정보를 손쉽게 확인할 수 있습니다.