IncomingRequest 클래스

IncomingRequest 클래스는 브라우저 같은 클라이언트로부터의 HTTP 요청을 객체 지향적으로 표현한 것입니다. 이 클래스는 RequestMessage 클래스의 모든 메서드에 접근할 수 있으며, 아래에 나열된 추가 메서드도 제공합니다.

요청 접근하기

현재 클래스가 CodeIgniter\Controller의 자손인 경우 요청 클래스의 인스턴스가 이미 채워져 있으며 클래스 속성으로 접근할 수 있습니다:

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class UserController extends Controller
{
    public function index()
    {
        if ($this->request->isAJAX()) {
            // ...
        }
    }
}

컨트롤러 내부가 아니더라도 애플리케이션의 Request 객체에 접근해야 하면 Services class를 통해 그 복사본을 가져올 수 있습니다:

<?php

$request = service('request');

다만, 컨트롤러가 아닌 클래스에서는 요청을 의존성으로 주입해 클래스 속성으로 저장하는 것이 바람직합니다:

<?php

namespace App\Libraries;

use CodeIgniter\HTTP\RequestInterface;

class SomeClass
{
    protected $request;

    public function __construct(RequestInterface $request)
    {
        $this->request = $request;
    }
}

$someClass = new SomeClass(service('request'));

요청 유형 확인

요청은 AJAX 요청이나 커맨드 라인에서의 요청 등 여러 유형일 수 있습니다. 이는 isAJAX()isCLI() 메서드로 확인할 수 있습니다:

<?php

// Check for AJAX request.
if ($request->isAJAX()) {
    // ...
}

// Check for CLI Request
if ($request->isCLI()) {
    // ...
}

참고

isAJAX() 메서드는 X-Requested-With 헤더에 의존하는데, 경우에 따라 JavaScript의 XHR 요청(예: fetch)에서는 기본적으로 전송되지 않습니다. 이 문제를 피하는 방법은 AJAX Requests 섹션을 참조하세요.

is() 메서드

Added in version 4.3.0.

v4.3.0부터는 is() 메서드를 사용할 수 있습니다. 이 메서드는 HTTP 메서드, 'ajax' 또는 'json'을 인자로 받아 불리언을 반환합니다.

참고

HTTP 메서드는 대소문자를 구분해야 하지만, 파라미터는 대소문자를 구분하지 않습니다.

<?php

// Checks HTTP methods. Returns boolean.
$request->is('get');
$request->is('post');
$request->is('put');
$request->is('delete');
$request->is('head');
$request->is('patch');
$request->is('options');

// Checks if it is an AJAX request. The same as `$request->isAJAX()`.
$request->is('ajax');

// Checks if it is a JSON request.
$request->is('json');

getMethod()

이 요청이 나타내는 HTTP 메서드는 getMethod() 메서드로 확인할 수 있습니다:

<?php

// Returns 'POST'
$method = $request->getMethod();

HTTP 메서드는 대소문자를 구분하며, 관례상 표준화된 메서드는 모두 대문자 US-ASCII 문자로 정의됩니다.

참고

v4.5.0 이전에는 기본적으로 메서드가 소문자 문자열(예: 'get', 'post' 등)로 반환되었으나, 이는 버그였습니다.

strtolower()로 감싸면 소문자 버전을 얻을 수 있습니다:

// Returns 'get'
$method = strtolower($request->getMethod());

요청이 HTTPS 연결을 통해 이루어졌는지 여부는 isSecure() 메서드로 확인할 수 있습니다:

<?php

if (! $request->isSecure()) {
    force_https();
}

입력 데이터 가져오기

Request 객체를 통해 $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV에서 입력을 가져올 수 있습니다. 이 데이터는 자동으로 필터링되지 않으며 요청으로 전달된 원시 입력 데이터가 반환됩니다.

참고

전역 변수를 직접 사용하는 것은 좋지 않습니다. 가능하면 피하고, Request 객체의 메서드를 사용하는 것을 권장합니다.

$_POST['something']과 같이 직접 접근하는 대신 이 메서드들을 사용하면, 항목이 존재하지 않을 때 null을 반환하고 데이터를 필터링할 수 있다는 장점이 있습니다. 따라서 항목 존재 여부를 먼저 확인하지 않고도 데이터를 편리하게 사용할 수 있습니다. 예를 들어 일반적으로는 다음과 같이 작성합니다:

<?php

$something = $_POST['foo'] ?? null;

CodeIgniter의 내장 메서드를 사용하면 다음과 같이 간단히 처리할 수 있습니다:

<?php

$something = $request->getPost('foo');

데이터 가져오기

getGet()

getGet() 메서드는 $_GET에서 데이터를 가져옵니다.

  • $request->getGet()

getPost()

getPost() 메서드는 $_POST에서 데이터를 가져옵니다.

  • $request->getPost()

getCookie()

getCookie() 메서드는 $_COOKIE에서 데이터를 가져옵니다.

  • $request->getCookie()

getServer()

getServer() 메서드는 $_SERVER에서 데이터를 가져옵니다.

  • $request->getServer()

getPostGet()

또한, $_GET 또는 $_POST에서 정보를 가져오되 조회 순서를 제어할 수 있는 유틸리티 메서드도 몇 가지 있습니다:

  • $request->getPostGet() - $_POST를 먼저 확인한 후 $_GET을 확인합니다.

getGetPost()

  • $request->getGetPost() - $_GET를 먼저 확인한 후 $_POST를 확인합니다.

getVar()

중요

이 메서드는 하위 호환성을 위해서만 존재합니다. 신규 프로젝트에서는 사용하지 마세요. 이미 사용 중이라면 더 적합한 다른 메서드로 교체하는 것을 권장합니다.

getVar() 메서드는 $_REQUEST에서 데이터를 가져오므로, php.ini의 request-order설정에 따라 $_GET, $_POST, $_COOKIE 중 어느 곳에서든 데이터를 반환할 수 있습니다.

경고

POST 데이터만 유효성 검사하려면 getVar()를 사용하지 마세요. 나중에 오는 값이 앞선 값을 덮어씁니다. request-order에서 “P” 뒤에 “C”를 설정하면 같은 이름의 쿠키가 POST 값을 덮어쓸 수 있습니다.

참고

수신 요청의 Content-Type 헤더가 application/json으로 설정된 경우, getVar() 메서드는 $_REQUEST 데이터 대신 JSON 데이터를 반환합니다.

JSON 데이터 가져오기

getJSON()을 사용하면 php://input의 내용을 JSON 스트림으로 가져올 수 있습니다.

참고

이 메서드는 수신 데이터가 유효한 JSON인지 확인할 방법이 없으므로, JSON을 기대하는 경우에만 사용해야 합니다.

<?php

$json = $request->getJSON();

기본적으로 JSON 데이터의 객체는 객체로 반환됩니다. 연관 배열로 변환하려면 첫 번째 인수로 true를 전달하세요.

두 번째와 세 번째 인수는 PHP의 json_decode() 함수의 $depth$flags 인수에 해당합니다.

JSON에서 특정 데이터 가져오기

getJsonVar()에 변수 이름을 전달하면 JSON 스트림에서 특정 데이터를 가져올 수 있습니다. 루트 레벨이 아닌 중첩 데이터를 꺼낼 때는 “점(dot)” 표기법을 사용할 수 있습니다.

<?php

/*
 * With a request body of:
 * {
 *     "foo": "bar",
 *     "fizz": {
 *         "buzz": "baz"
 *     }
 * }
 */

$data = $request->getJsonVar('foo');
// $data = "bar"

$data = $request->getJsonVar('fizz.buzz');
// $data = "baz"

결과를 객체 대신 연관 배열로 받으려면 두 번째 인수에 true를 전달하세요:

<?php

// With the same request as above
$data = $request->getJsonVar('fizz');
// $data->buzz = "baz"

$data = $request->getJsonVar('fizz', true);
// $data = ["buzz" => "baz"]

참고

“점” 표기법에 대한 자세한 내용은 Array 헬퍼의 dot_array_search() 문서를 참고하세요.

원시 데이터 가져오기 (PUT, PATCH, DELETE)

getRawInput()을 사용하면 php://input의 내용을 원시 스트림으로 가져올 수 있습니다:

<?php

$data = $request->getRawInput();

이 메서드는 데이터를 가져와 배열로 변환합니다. 예시:

<?php

var_dump($request->getRawInput());

/*
 * Outputs:
 * [
 *     'Param1' => 'Value1',
 *     'Param2' => 'Value2',
 * ]
 */

getRawInputVar()를 사용하면 원시 스트림에서 지정한 변수를 가져와 필터링할 수도 있습니다.

<?php

// When the request body is 'foo=one&bar=two&baz[]=10&baz[]=20'
var_dump($request->getRawInputVar('bar'));
// Outputs: two

// foo=one&bar=two&baz[]=10&baz[]=20
var_dump($request->getRawInputVar(['foo', 'bar']));
/*
 * Outputs:
 * [
 *      'foo' => 'one',
 *      'bar' => 'two'
 * ]
 */

// foo=one&bar=two&baz[]=10&baz[]=20
var_dump($request->getRawInputVar('baz'));
/*
 * Outputs:
 * [
 *      '10',
 *      '20'
 * ]
 */

// foo=one&bar=two&baz[]=10&baz[]=20
var_dump($request->getRawInputVar('baz.0'));
// Outputs: 10

입력 데이터 필터링

애플리케이션의 보안을 유지하려면 입력값에 접근할 때 필터링하는 것이 좋습니다. 이러한 메서드의 두 번째 인수로 사용할 필터 유형을 전달할 수 있습니다. 필터링에는 기본 제공 filter_var() 함수가 사용됩니다. 유효한 필터 유형 목록은 PHP 매뉴얼의 valid filter types을 참고하세요.

POST 변수 필터링 예시:

<?php

$email = $request->getPost('email', FILTER_SANITIZE_EMAIL);

위에서 언급한 모든 메서드는 두 번째 인수로 필터 유형을 지원하지만, getJSON()getRawInput() 은 예외입니다.

헤더 가져오기

headers() 메서드를 사용하면 요청과 함께 전송된 모든 헤더에 접근할 수 있습니다. 이 메서드는 헤더 이름을 키로, CodeIgniter\HTTP\Header 인스턴스를 값으로 하는 배열을 반환합니다:

<?php

var_dump($request->headers());

/*
 * Outputs:
 * [
 *     'Host'          => CodeIgniter\HTTP\Header,
 *     'Cache-Control' => CodeIgniter\HTTP\Header,
 *     'Accept'        => CodeIgniter\HTTP\Header,
 * ]
 */

단일 헤더만 필요한 경우 header() 메서드에 헤더 이름을 전달하면 됩니다. 대소문자를 구분하지 않고 해당 헤더 객체를 반환하며, 없으면 null을 반환합니다:

<?php

// these are all equivalent
$host = $request->header('host');
$host = $request->header('Host');
$host = $request->header('HOST');

hasHeader()를 사용하면 해당 헤더가 요청에 포함되어 있는지 확인할 수 있습니다:

<?php

if ($request->hasHeader('DNT')) {
    // Don't track something...
}

헤더 값을 한 줄 문자열로 받으려면 getHeaderLine() 메서드를 사용하세요:

<?php

// Accept-Encoding: gzip, deflate, sdch
echo 'Accept-Encoding: ' . $request->getHeaderLine('accept-encoding');

헤더 이름과 값을 모두 포함한 단일 문자열이 필요하다면 헤더를 문자열로 캐스팅하면 됩니다:

<?php

echo (string) $header;

요청 URL

$request->getUri() 메서드를 통해 현재 요청의 URI를 나타내는 URI 객체를 가져올 수 있습니다. 이 객체를 문자열로 캐스팅하면 현재 요청의 전체 URL을 얻을 수 있습니다:

<?php

$uri = (string) $request->getUri();

이 객체를 통해 요청의 각 부분을 개별적으로 가져올 수 있습니다:

<?php

$uri = $request->getUri();

echo $uri->getScheme();         // http
echo $uri->getAuthority();      // snoopy:password@example.com:88
echo $uri->getUserInfo();       // snoopy:password
echo $uri->getHost();           // example.com
echo $uri->getPort();           // 88
echo $uri->getPath();           // /path/to/page
echo $uri->getRoutePath();      // path/to/page
echo $uri->getQuery();          // foo=bar&bar=baz
print_r($uri->getSegments());   // Array ( [0] => path [1] => to [2] => page )
echo $uri->getSegment(1);       // path
echo $uri->getTotalSegments();  // 3

getRoutePath()를 사용하면 baseURL에 상대적인 현재 URI 경로(문자열)를 다룰 수 있습니다.

참고

getRoutePath() 메서드는 v4.4.0부터 사용할 수 있습니다. v4.4.0 이전에는 getPath() 메서드가 baseURL에 상대적인 경로를 반환했습니다.

업로드된 파일

$request->getFiles()를 통해 업로드된 모든 파일의 정보를 가져올 수 있으며, CodeIgniter\HTTP\Files\UploadedFile 인스턴스의 배열을 반환합니다. 이를 통해 업로드 파일 처리가 쉬워지고, 보안 위험을 최소화하는 모범 사례가 적용됩니다.

<?php

$files = $request->getFiles();

자세한 내용은 업로드된 파일 다루기를 참고하세요.

HTML 파일 입력 필드에 지정된 파일명을 기반으로 단일 파일을 가져올 수 있습니다:

<?php

$file = $request->getFile('userfile');

HTML 파일 입력 필드에 지정된 파일명을 기반으로, 다중 파일 업로드 시 동일한 이름의 파일 배열을 가져올 수 있습니다:

<?php

$files = $request->getFileMultiple('userfile');

참고

여기서 파일들은 $_FILES에 해당합니다. 사용자가 파일을 선택하지 않고 폼을 제출하더라도 파일 항목은 존재합니다. 실제로 파일이 업로드되었는지 확인하려면 UploadedFile의 isValid() 메서드를 사용하세요. 자세한 내용은 파일 검증을 참고하세요.

콘텐츠 협상

negotiate() 메서드를 통해 요청과의 콘텐츠 유형 협상을 쉽게 처리할 수 있습니다:

<?php

$language    = $request->negotiate('language', ['en-US', 'en-GB', 'fr', 'es-mx']);
$imageType   = $request->negotiate('media', ['image/png', 'image/jpg']);
$charset     = $request->negotiate('charset', ['UTF-8', 'UTF-16']);
$contentType = $request->negotiate('media', ['text/html', 'text/xml']);
$encoding    = $request->negotiate('encoding', ['gzip', 'compress']);

자세한 내용은 콘텐츠 협상 페이지를 참고하세요.

클래스 참조

참고

여기에 나열된 메서드 외에도 이 클래스는 Request 클래스Message 클래스의 메서드를 상속합니다.

사용 가능한 부모 클래스 제공 메서드는 다음과 같습니다:

  • CodeIgniter\HTTP\Request::getIPAddress()

  • CodeIgniter\HTTP\Request::isValidIP()

  • CodeIgniter\HTTP\Request::getMethod()

  • CodeIgniter\HTTP\Request::setMethod()

  • CodeIgniter\HTTP\Request::getServer()

  • CodeIgniter\HTTP\Request::setGlobal()

  • CodeIgniter\HTTP\Request::fetchGlobal()

  • CodeIgniter\HTTP\Message::getBody()

  • CodeIgniter\HTTP\Message::setBody()

  • CodeIgniter\HTTP\Message::appendBody()

  • CodeIgniter\HTTP\Message::populateHeaders()

  • CodeIgniter\HTTP\Message::headers()

  • CodeIgniter\HTTP\Message::header()

  • CodeIgniter\HTTP\Message::hasHeader()

  • CodeIgniter\HTTP\Message::getHeaderLine()

  • CodeIgniter\HTTP\Message::setHeader()

  • CodeIgniter\HTTP\Message::removeHeader()

  • CodeIgniter\HTTP\Message::appendHeader()

  • CodeIgniter\HTTP\Message::prependHeader()

  • CodeIgniter\HTTP\Message::getProtocolVersion()

  • CodeIgniter\HTTP\Message::setProtocolVersion()

class CodeIgniter\HTTP\IncomingRequest
isCLI()
반환:

요청이 커맨드 라인에서 시작된 경우 true, 그렇지 않으면 false.

반환 형식:

bool

isAJAX()
반환:

요청이 AJAX 요청이면 true, 그렇지 않으면 false.

반환 형식:

bool

isSecure()
반환:

요청이 HTTPS 요청이면 true, 그렇지 않으면 false.

반환 형식:

bool

getVar([$index = null[, $filter = null[, $flags = null]]])
매개변수:
  • $index (string) – 찾을 변수/키의 이름입니다.

  • $filter (int) – 적용할 필터 유형입니다. 필터 목록은 Types of filters에서 확인할 수 있습니다.

  • $flags (int) – 적용할 플래그입니다. 플래그 목록은 Filter flags에서 확인할 수 있습니다.

반환:

매개변수를 지정하지 않으면 $_REQUEST 전체, 지정하면 해당 REQUEST 값 또는 없으면 null.

반환 형식:

array|bool|float|int|object|string|null

중요

이 메서드는 하위 호환성을 위해서만 존재합니다. 신규 프로젝트에서는 사용하지 마세요. 이미 사용 중이라면 더 적합한 다른 메서드로 교체하는 것을 권장합니다.

이 메서드는 getGet()과 동일하지만 REQUEST 데이터를 가져옵니다.

getGet([$index = null[, $filter = null[, $flags = null]]])
매개변수:
  • $index (string) – 찾을 변수/키의 이름입니다.

  • $filter (int) – 적용할 필터 유형입니다. 필터 목록은 Types of filters에서 확인할 수 있습니다.

  • $flags (int) – 적용할 플래그입니다. 플래그 목록은 Filter flags에서 확인할 수 있습니다.

반환:

매개변수를 지정하지 않으면 $_GET 전체, 지정하면 해당 GET 값 또는 없으면 null.

반환 형식:

array|bool|float|int|object|string|null

첫 번째 인수에 찾고자 하는 GET 항목의 이름을 지정합니다:

<?php

$request->getGet('some_data');

가져오려는 항목이 존재하지 않으면 메서드는 null을 반환합니다.

두 번째 선택적 인수를 사용하면 PHP 필터를 통해 데이터를 처리할 수 있습니다. 원하는 필터 유형을 두 번째 인수로 전달하세요:

<?php

$request->getGet('some_data', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

모든 GET 항목을 배열로 반환하려면 인수 없이 호출하세요.

모든 GET 항목을 가져와 필터를 적용하려면 첫 번째 인수를 null로, 두 번째 인수를 원하는 필터로 설정하세요:

<?php

$request->getGet(null, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// returns all GET items with string sanitation

여러 GET 파라미터를 배열로 반환하려면 필요한 키 전체를 배열로 전달하세요:

<?php

$request->getGet(['field1', 'field2']);

필터링이 적용된 파라미터를 가져오려면 마찬가지로 두 번째 인수에 필터 유형을 설정하세요:

<?php

$request->getGet(['field1', 'field2'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
getPost([$index = null[, $filter = null[, $flags = null]]])
매개변수:
  • $index (string) – 찾을 변수/키의 이름입니다.

  • $filter (int) – 적용할 필터 유형입니다. 필터 목록은 여기에서 확인할 수 있습니다.

  • $flags (int) – 적용할 플래그입니다. 플래그 목록은 여기에서 확인할 수 있습니다.

반환:

매개변수를 지정하지 않으면 $_POST 전체, 지정하면 해당 POST 값 또는 없으면 null.

반환 형식:

array|bool|float|int|object|string|null

이 메서드는 getGet()과 동일하지만 POST 데이터를 가져옵니다.

getPostGet([$index = null[, $filter = null[, $flags = null]]])
매개변수:
  • $index (string) – 찾을 변수/키의 이름입니다.

  • $filter (int) – 적용할 필터 유형입니다. 필터 목록은 Types of filters에서 확인할 수 있습니다.

  • $flags (int) – 적용할 플래그입니다. 플래그 목록은 Filter flags에서 확인할 수 있습니다.

반환:

매개변수를 지정하지 않으면 $_POST$_GET을 합산 반환(충돌 시 POST 우선), 지정하면 POST 값을 먼저 찾고 없으면 GET 값을 찾으며 모두 없으면 null.

반환 형식:

array|bool|float|int|object|string|null

이 메서드는 getPost()getGet()을 합친 방식으로 동작합니다. POST를 먼저, 그 다음 GET 순서로 데이터를 검색합니다:

<?php

$request->getPostGet('field1');

인덱스를 지정하지 않으면 POST와 GET 스트림을 합쳐 반환합니다. 이름이 충돌하는 경우 POST 데이터가 우선합니다.

getGetPost([$index = null[, $filter = null[, $flags = null]]])
매개변수:
  • $index (string) – 찾을 변수/키의 이름입니다.

  • $filter (int) – 적용할 필터 유형입니다. 필터 목록은 Types of filters에서 확인할 수 있습니다.

  • $flags (int) – 적용할 플래그입니다. 플래그 목록은 Filter flags에서 확인할 수 있습니다.

반환:

매개변수를 지정하지 않으면 $_GET$_POST를 합산 반환(충돌 시 GET 우선), 지정하면 GET 값을 먼저 찾고 없으면 POST 값을 찾으며 모두 없으면 null.

반환 형식:

array|bool|float|int|object|string|null

이 메서드는 getPost()getGet()을 합친 방식으로 동작합니다. GET을 먼저, 그 다음 POST 순서로 데이터를 검색합니다:

<?php

$request->getGetPost('field1');

인덱스를 지정하지 않으면 GET과 POST 스트림을 합쳐 반환합니다. 이름이 충돌하는 경우 GET 데이터가 우선합니다.

getCookie([$index = null[, $filter = null[, $flags = null]]])
매개변수:
  • $index (array|string|null) – 쿠키 이름

  • $filter (int) – 적용할 필터 유형입니다. 필터 목록은 Types of filters에서 확인할 수 있습니다.

  • $flags (int) – 적용할 플래그입니다. 플래그 목록은 Filter flags에서 확인할 수 있습니다.

반환:

매개변수를 지정하지 않으면 $_COOKIE 전체, 지정하면 해당 쿠키 값 또는 없으면 null.

반환 형식:

array|bool|float|int|object|string|null

이 메서드는 getPost()getGet()과 동일하지만 쿠키 데이터를 가져옵니다:

<?php

$request->getCookie('some_cookie');
$request->getCookie('some_cookie', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // with filter

여러 쿠키 값을 배열로 반환하려면 필요한 키 전체를 배열로 전달하세요:

<?php

$request->getCookie(['some_cookie', 'some_cookie2']);

참고

Cookie 헬퍼get_cookie() 함수와 달리, 이 메서드는 설정된 Config\Cookie::$prefix 값을 앞에 붙이지 않습니다.

getServer([$index = null[, $filter = null[, $flags = null]]])
매개변수:
  • $index (array|string|null) – 값 이름

  • $filter (int) – 적용할 필터 유형입니다. 필터 목록은 Types of filters에서 확인할 수 있습니다.

  • $flags (int) – 적용할 플래그입니다. 플래그 목록은 Filter flags에서 확인할 수 있습니다.

반환:

항목이 존재하면 $_SERVER 값, 없으면 null.

반환 형식:

array|bool|float|int|object|string|null

이 메서드는 getPost(), getGet(), getCookie() 메서드와 동일하지만 서버 데이터($_SERVER)를 가져옵니다:

<?php

$request->getServer('some_data');

여러 $_SERVER 값을 배열로 반환하려면 필요한 키 전체를 배열로 전달하세요.

<?php

$request->getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
getUserAgent()
반환:

SERVER 데이터에서 찾은 User Agent 문자열, 없으면 null.

반환 형식:

CodeIgniter\HTTP\UserAgent

이 메서드는 SERVER 데이터에서 User Agent 인스턴스를 반환합니다:

<?php

$request->getUserAgent();
getPath()
반환:

baseURL에 상대적인 현재 URI 경로.

반환 형식:

string

이 메서드는 baseURL에 상대적인 현재 URI 경로를 반환합니다.

참고

v4.4.0 이전에는 IncomingRequest::$uri가 base URL에 대한 전체 App 설정을 인식하지 못할 수 있었기 때문에, 이 메서드가 “현재 URI”를 확인하는 가장 안전한 방법이었습니다.