REFERENCE‎ > ‎

PHP Ajax Proxy

Ajax 호출에는 보안상 cross-domain 제한이 걸려 있고, 이를 우회하기 위해 Ajax 호출을 받아서 외부 주소로 전달해주는 proxy 스크립트를 사용하게 되는데 단순 GET 호출이 아니라 POST나 파일 폼 제출까지 처리할 경우가 있다.

$_POST

  • 'method' => 'POST'
  • 'content'=> http_build_query() 반환값
  • 'header' => "Content-Type: application/x-www-form-urlencoded\r\n"
위와 같은 헤더 정보를 연관배열에 담고 stream_context_create('http'=>배열) 식으로 생성하여 file_get_contents()에 붙여준다.

$_GET

file_get_contents()를 이용해 http_build_query() 반환값을 포함한 대상 주소를 호출하는 것으로 끝난다.

헤더 정보가 추가될 경우에는 stream_context_create()를 통해 생성하여 file_get_contents()에 같이 붙여준다.

$_FILES

http_post_fields()는 PHP의 HTTP 확장에서 제공하는 함수이며, POST 정보에 파일까지 포함해 처리해준다.

인자는 주소, POST 정보, 파일 정보, 헤더 옵션, 진행결과 저장용 변수이며 파일 정보 이후는 없어도 된다.

주소는 URL이면 되고, POST 값은 http_build_query()에서 요구하는 것과 동일한 형태면 된다. 헤더 옵션은 문서를 참조해 여러가지 정보를 전달할 수 있다.

파일 정보의 경우 $_FILES를 그대로 쓸 수는 없고 아래와 같이 $_FILES 각 항목을 다시 정리한 2차원 배열이 되어야 한다.
  $fileArray = Array();
  foreach ($_FILES as $_fieldName=>$_file) {
    $fileArray[] = Array(
      'name' => $_fieldName
      ,'type' => $_file['type']
      ,'file' => $_file['tmp_name']
    );
  }

인증 정보

PHP 페이지에서 세션 등의 인정 정보를 요구할 경우 proxy를 거쳐 호출되는 페이지에도 해당 인증 정보를 유지해야 한다.
  • stream_context_create()를 사용할 경우 헤더 정보에 header=>'Cookie: PHPSESSID='.$_COOKIE['PHPSESSID']."\r\n" 식으로 한 줄을 추가하면 된다. (다른 header 항목이 있을 경우는 해당 문자열에 붙여서 써주면 된다.)
  • http_post_fields()에서는 헤더 정보에 Array('cookies'=>Array('PHPSESSID'=>$_COOKIE['PHPSESSID']))를 전달한다.
PHPSESSID라는 이름은 서버 설정에 따라 다를 수 있다.
Comments