개발/PHP

PHP에서 POST요청을 보내는 CURL

duknock 2022. 4. 5. 16:30
반응형

자바스크립트에서 AJAX로 요청을 보내면 해당 URL이나 전달받는 데이터가 브라우저에 그대로 노출된다. (개발자도구 눌러서 보면 다 뜬다.)

 

평소에는 별 상관없지만 로그인과 같이 보안과 직결되는 정보를 보낼때에는 문제가 된다.

 

그럴때에는 브라우저에 노출이 되지 않는 서버사이드 언어를 사용하면 해결이 되는 듯 하다!

(본질적인 해결방법인지는 모르겠다. 아무튼 브라우저에는 안뜬다. 안뜨면 됐지)

 

나는 PHP에 대해선 1도 모르는 응애코더지만 한번 구현해보기 위해 열심히 찾아보았다.

	//전송할 데이터다. 꼭 array가 아니여도 된다.
    $FIELDS = array(
      '키값' => $밸류값,
      '키값' => $밸류값
    );

    //curl 옵션을 정해주는 array다. curl_setopt_array 대신 curl_setopt 함수를 여러개 적어도 된다.
    $opts = array(
      CURLOPT_URL => $URL,
      CURLOPT_SSL_VERIFYPEER => false,
      CURLOPT_SSLVERSION => 1, // TLS
      CURLOPT_POST => true,
      CURLOPT_POSTFIELDS => $FIELDS,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_HEADER => false
    );

    //curl 통신 시작
    $CURL = curl_init();
    //curl 옵션 설정
    curl_setopt_array($CURL, $opts);
    //curl 통신 결과 값 받기
    $response = curl_exec($CURL);
    //curl 통신 종료
    curl_close($CURL);

 

원래는 개복잡한 http통신을 jquery를 통해 $.ajax() 함수 남발하면서 쉽게 썼었는데 php에서 curl 쓰려니까 뭐 이리 옵션이 많은지 모르겠다.

예전에 jquery 안쓰고 바닐라js로 하겠다고 $.ajax()대신 xmlhttprequest() 쓰던거보다 더 어렵다.

 

대충 보면 방식은 ajax랑 비슷한거 같다.

 

1. curl_init() 으로 통신을 시작하고

2. curl_setopt_array()로 통신 옵션을 설정한다.

3. curl_exec() 로 결과를 받고

4. curl_close() 로 통신을 종료한다.


근데 curl 요청 보낼 때마다 이걸 맨날 쓰려고 생각하니 벌써 대갈통이 아프다...

긴 코드는 가독성도 떨어지고 일일히 이렇게 따로 적으면 유지보수 할때 수정하기도 힘들다.

(예시로 curl 요청 보내는 코드블럭 1000개가 있는데 얘네 옵션 하나하나 변경하려고 하면 그날 야근각이다.)

 

그래서 curl요청 보내는 함수를 따로 만들어 모듈화 시키는것이 좋을것 같아서 아래와 같이 따로 코드를 짜줬다.

<?php
function curl_request($url, $method, $header, $httpheader, $body)
{
    $ch = curl_init();                                 //curl 초기화
    curl_setopt($ch, CURLOPT_URL, $url);               //URL 지정하기
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    //요청 결과를 문자열로 반환
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);      //connection timeout 60초
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   //원격 서버의 인증서가 유효한지 검사 안함
    curl_setopt($ch, CURLOPT_SSLVERSION, 1);   // HTTPS 접속
    
    if($method != "GET"){
        curl_setopt($ch, CURLOPT_POST, true);              //true시 post 전송
        curl_setopt($ch, CURLOPT_POSTFIELDS, $body);       //POST data
    }else{
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    }
    
    curl_setopt($ch, CURLOPT_HEADER, $header);
    if($header == 1){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);	//header가 있으면 headerData 전송
    }
    
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}
?>

 

이렇게 함수를 만들어서 따로 저장해주면 매번 curl 요청 보낼때마다 30줄씩 코드를 써가며 지랄할 필요 없이

include로 불러와서 인수만 넣어주면 된다!

 

예시로 카카오 REST API에서 토큰을 요청하는 코드에 적용해 보았다.

//사용자 토큰 받기
$params = sprintf( 'grant_type=authorization_code&{파라미터는 이하생략}');
$TOKEN_URL = "https://kauth.kakao.com/oauth/token";
$opts = array(
	CURLOPT_URL => $TOKEN_URL,
	CURLOPT_SSL_VERIFYPEER => false,
	CURLOPT_SSLVERSION => 1,
	CURLOPT_POST => true,
	CURLOPT_POSTFIELDS => $params,
	CURLOPT_RETURNTRANSFER => true,
	CURLOPT_HEADER => false
	);
$curl = curl_init();
curl_setopt_array($curl, $opts);
$result = curl_exec($curl);
curl_close($curl);

echo $result;

원래는 이렇게 옵션을 다 지정해줘야하는 코드가

include 'curl_request()가 있는 php의 경로';
//사용자 토큰 받기
$params = sprintf( 'grant_type=authorization_code&{파라미터는 이하생략}');
$curl_url = "https://kauth.kakao.com/oauth/token";
$curl_method = "POST";
$curl_header = false;
$curl_httpheader = null;
$curl_body = $params;

$curl_result = curl_request($curl_url, $curl_method, $curl_header, $curl_httpheader, $curl_body);

echo $curl_result;

이렇게 간단하게 줄어들었다! 👏👏👏


반응형