HTTP 응답

Response 클래스는 이를 호출한 클라이언트에 응답하는 서버에만 적합한 메소드를 사용하여 HTTP Message Class을 확장합니다.

응답 작업

응답 클래스가 인스턴스화되어 컨트롤러로 전달됩니다. $this->response을(를) 통해 액세스할 수 있습니다. Services::response()이 반환하는 것과 동일한 인스턴스입니다. 우리는 이를 전역 응답 인스턴스라고 부릅니다.

CodeIgniter가 헤더와 본문 전송을 처리하므로 클래스를 직접 건드릴 필요가 없는 경우가 많습니다. 페이지가 요청한 콘텐츠를 성공적으로 생성했다면 매우 좋습니다. 문제가 발생하거나 매우 구체적인 상태 코드를 다시 보내야 하거나 강력한 HTTP 캐싱을 활용해야 하는 경우에도 이 기능이 있습니다.

출력 설정

스크립트의 출력을 직접 설정해야 하고 CodeIgniter를 사용하여 자동으로 가져오지 않으려면 setBody 메서드를 사용하여 수동으로 수행합니다. 이는 일반적으로 응답의 상태 코드 설정과 함께 사용됩니다.

<?php

$this->response->setStatusCode(404)->setBody($body);

이유 문구(‘OK’, ‘Created’, ‘Moved Permanently’)가 자동으로 추가되지만 setStatusCode() 메소드의 두 번째 매개변수로 사용자 정의 이유를 추가할 수 있습니다.

<?php

$this->response->setStatusCode(404, 'Nope. Not here.');

setJSON()setXML() 메서드를 사용하여 배열 형식을 JSON 또는 XML로 설정하고 콘텐츠 유형 헤더를 적절한 MIME으로 설정할 수 있습니다. 일반적으로 변환할 데이터 배열을 보냅니다.

<?php

$data = [
    'success' => true,
    'id'      => 123,
];

return $this->response->setJSON($data);

// or
return $this->response->setXML($data);

헤더 설정

세트헤더()

응답에 대해 헤더를 설정해야 하는 경우가 많습니다. Response 클래스는 setHeader() 메소드를 사용하여 이 작업을 매우 간단하게 만듭니다.

첫 번째 매개변수는 헤더의 이름입니다. 두 번째 매개변수는 클라이언트에 전송될 때 올바르게 결합될 문자열 또는 값 배열일 수 있는 값입니다.

<?php

$this->response->setHeader('Location', 'http://example.com')
    ->setHeader('WWW-Authenticate', 'Negotiate');

기본 PHP 함수를 사용하는 대신 이러한 함수를 사용하면 헤더가 너무 일찍 전송되어 오류가 발생하지 않도록 하고 테스트가 가능해집니다.

중요

v4.6.0부터 PHP의 기본 header() 함수를 사용하여 헤더를 설정한 후 Response 클래스를 사용하여 동일한 헤더를 설정하면 이전 헤더를 덮어쓰게 됩니다.

참고

이 메서드는 헤더를 응답 인스턴스로 설정합니다. 따라서 다른 응답 인스턴스를 생성하고 반환하는 경우(예: redirect()을 호출하는 경우) 여기에 설정된 헤더는 자동으로 전송되지 않습니다.

추가헤더()

헤더가 존재하고 둘 이상의 값을 가질 수 있는 경우 appendHeader()prependHeader() 메서드를 사용하여 각각 값 목록의 끝이나 시작에 값을 추가할 수 있습니다. 첫 번째 매개변수는 헤더의 이름이고, 두 번째 매개변수는 추가하거나 앞에 추가할 값입니다.

<?php

$this->response->setHeader('Cache-Control', 'no-cache')
    ->appendHeader('Cache-Control', 'must-revalidate');

제거헤더()

헤더 이름을 유일한 매개변수로 사용하는 removeHeader() 메서드를 사용하여 응답에서 헤더를 제거할 수 있습니다. 대소문자를 구분하지 않습니다.

<?php

$this->response->removeHeader('Location');

리디렉션

리디렉션을 생성하려면 redirect() 함수를 사용하세요.

RedirectResponse 인스턴스를 반환합니다. Services::response()이 반환하는 전역 응답 인스턴스와는 다른 인스턴스입니다.

경고

redirect()을 호출하기 전에 쿠키 또는 응답 헤더를 설정하면 전역 응답 인스턴스로 설정되며 RedirectResponse 인스턴스에 자동으로 복사되지 않습니다. 이를 보내려면 withCookies() 또는 withHeaders() 메서드를 수동으로 호출해야 합니다.

중요

리디렉션하려면 RedirectResponse의 인스턴스가 Controller 또는 Controller Filter의 메서드에서 반환되어야 합니다. __construct() 또는 initController() 메서드는 어떤 값도 반환할 수 없습니다. RedirectResponse 반환을 잊어버리면 리디렉션이 발생하지 않습니다.

URI 경로로 리디렉션

baseURL에 상대적인 URI 경로를 전달하려면 redirect()->to()을 사용하세요.

// Go to specific URI path. "admin/home" is the URI path relative to baseURL.
return redirect()->to('admin/home');

참고

URL에 제거하려는 조각이 있는 경우 메소드에서 새로 고침 매개변수를 사용할 수 있습니다. return redirect()->to('admin/home', null, 'refresh');처럼요.

정의된 경로로 리디렉션

reverse routing에 대해 route name 또는 Controller::메서드를 전달하려면 redirect()->route()을 사용하세요.

// Go to a named route. "user_gallery" is the route name, not a URI path.
return redirect()->route('user_gallery');

함수에 인수를 전달할 때 상대/전체 URI가 아닌 역방향 라우팅을 위한 경로 이름 또는 Controller::메서드로 처리되며 redirect()->route()을 사용하는 것과 동일하게 처리됩니다.

// Go to a named/reverse-routed URI.
return redirect('named_route');

뒤로 리디렉션

다시 리디렉션하려면 redirect()->back()을 사용하세요.

// Go back to the previous page.
return redirect()->back();

// Keep the old input values upon redirect so they can be used by the `old()` function.
return redirect()->back()->withInput();

// Set a flash message.
return redirect()->back()->with('foo', 'message');

참고

redirect()->back()은 브라우저의 ‘뒤로’ 버튼과 다릅니다. 세션을 사용할 수 있을 때 방문자는 “세션 중에 본 마지막 페이지”로 이동합니다. 세션이 로드되지 않았거나 사용할 수 없는 경우 HTTP_REFERER의 정리된 버전이 사용됩니다.

쿠키로 리디렉션

redirect()을 호출하기 전에 쿠키를 설정하면 전역 응답 인스턴스로 설정되며 RedirectResponse 인스턴스에 자동으로 복사되지 않습니다.

쿠키를 보내려면 withCookies() 메서드를 수동으로 호출해야 합니다.

// Copies all cookies from global response instance.
return redirect()->back()->withCookies();

헤더로 리디렉션

redirect()을 호출하기 전에 응답 헤더를 설정하면 전역 응답 인스턴스로 설정되며 RedirectResponse 인스턴스에 자동으로 복사되지 않습니다.

헤더를 보내려면 withHeaders() 메서드를 수동으로 호출해야 합니다.

// Copies all headers from the global response instance.
return redirect()->back()->withHeaders();

리디렉션 상태 코드

GET 요청의 기본 HTTP 상태 코드는 302입니다. 그러나 HTTP/1.1 이상을 사용하는 경우 POST/PUT/DELETE 요청에는 303이 사용되고 기타 모든 요청에는 307이 사용됩니다.

상태 코드를 지정할 수 있습니다.

// Redirect to a URI path relative to baseURL with status code 301.
return redirect()->to('admin/home', 301);

// Redirect to a route with status code 308.
return redirect()->route('user_gallery', [], 308);

// Redirect back with status code 302.
return redirect()->back(302);

참고

버그로 인해 v4.3.3 이하 버전에서는 상태 코드를 지정하더라도 실제 리디렉션 응답의 상태 코드가 변경될 수 있습니다. ChangeLog v4.3.4을(를) 참조하세요.

리디렉션에 대한 HTTP 상태 코드를 모르는 경우 Redirections in HTTP을 읽는 것이 좋습니다.

강제 파일 다운로드

Response 클래스는 클라이언트에 파일을 보내는 간단한 방법을 제공하여 브라우저에 데이터를 컴퓨터에 다운로드하라는 메시지를 표시합니다. 이를 위해 적절한 헤더가 설정됩니다.

첫 번째 매개변수는 다운로드한 파일의 이름을 지정할 이름이고, 두 번째 매개변수는 파일 데이터입니다.

두 번째 매개변수를 null로 설정하고 $filename이 기존의 읽을 수 있는 파일 경로인 경우 해당 내용이 대신 읽혀집니다.

세 번째 매개변수를 boolean true로 설정하면 실제 파일 MIME 유형(파일 이름 확장자 기반)이 전송되므로 브라우저에 해당 유형에 대한 핸들러가 있는 경우 이를 사용할 수 있습니다.

예:

<?php

$data = 'Here is some text!';
$name = 'mytext.txt';

return $this->response->download($name, $data);

서버에서 기존 파일을 다운로드하려면 두 번째 매개변수에 null을 명시적으로 전달해야 합니다.

<?php

// Contents of photo.jpg will be automatically read
return $this->response->download('/path/to/photo.jpg', null);

선택적 setFileName() 메소드를 사용하여 파일 이름이 클라이언트 브라우저로 전송될 때 변경하십시오.

<?php

return $this->response->download('awkwardEncryptedFileName.fakeExt', null)->setFileName('expenses.csv');

참고

다운로드가 클라이언트로 전송되려면 응답 객체가 반환되어야 합니다. 이렇게 하면 응답이 클라이언트에 전송되기 전에 모든 after 필터를 통과할 수 있습니다.

브라우저에서 파일 열기

일부 브라우저에서는 PDF와 같은 파일을 표시할 수 있습니다. 파일을 저장하는 대신 파일을 표시하도록 브라우저에 지시하려면 DownloadResponse::inline() 메서드를 호출하세요.

<?php

$data = 'Here is some text!';
$name = 'mytext.txt';

return $this->response->download($name, $data)->inline();

HTTP 캐싱

HTTP 사양에는 클라이언트(종종 웹 브라우저)가 결과를 캐시하는 데 도움이 되는 도구가 내장되어 있습니다. 올바르게 사용하면 클라이언트에게 아무것도 변경되지 않았기 때문에 서버에 전혀 접속할 필요가 없다는 것을 알려주기 때문에 애플리케이션의 성능이 크게 향상될 수 있습니다. 그리고 그보다 더 빨리 갈 수는 없습니다.

이는 Cache-ControlETag 헤더를 통해 처리됩니다. 이 가이드는 캐시 헤더의 모든 기능을 철저하게 소개하기에는 적합하지 않지만 Google Developers에서 잘 이해할 수 있습니다.

기본적으로 CodeIgniter를 통해 전송된 모든 응답 개체에는 HTTP 캐싱이 꺼져 있습니다. 옵션과 정확한 상황은 너무 다양하여 끄는 것 외에는 좋은 기본값을 만들 수 없습니다. setCache() 메소드를 통해 캐시 값을 필요한 값으로 설정하는 것은 간단합니다.

<?php

$options = [
    'max-age'  => 300,
    's-maxage' => 900,
    'etag'     => 'abcde',
];
$this->response->setCache($options);

$options 배열은 몇 가지 예외를 제외하고 Cache-Control 헤더에 할당된 키/값 쌍의 배열을 사용합니다. 특정 상황에 필요한 대로 모든 옵션을 자유롭게 설정할 수 있습니다. 대부분의 옵션은 Cache-Control 헤더에 적용되지만 etaglast-modified 옵션을 해당 헤더에 지능적으로 처리합니다.

수업 참고자료

참고

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

메시지 클래스에서 상속된 메서드는 다음과 같습니다.

  • CodeIgniter\HTTP\Message::body()

  • CodeIgniter\HTTP\Message::setBody()

  • CodeIgniter\HTTP\Message::populateHeaders()

  • CodeIgniter\HTTP\Message::headers()

  • CodeIgniter\HTTP\Message::header()

  • CodeIgniter\HTTP\Message::headerLine()

  • CodeIgniter\HTTP\Message::setHeader()

  • CodeIgniter\HTTP\Message::removeHeader()

  • CodeIgniter\HTTP\Message::appendHeader()

  • CodeIgniter\HTTP\Message::protocolVersion()

  • CodeIgniter\HTTP\Message::setProtocolVersion()

  • CodeIgniter\HTTP\Message::negotiateMedia()

  • CodeIgniter\HTTP\Message::negotiateCharset()

  • CodeIgniter\HTTP\Message::negotiateEncoding()

  • CodeIgniter\HTTP\Message::negotiateLanguage()

  • CodeIgniter\HTTP\Message::negotiateLanguage()

class CodeIgniter\HTTP\Response
getStatusCode()
반환:

이 응답의 현재 HTTP 상태 코드

반환 형식:

int

이 응답의 현재 상태 코드를 반환합니다. 상태 코드가 설정되지 않은 경우 BadMethodCallException이 발생합니다.

<?php

echo $response->getStatusCode();
setStatusCode($code[, $reason=''])
매개변수:
  • $code (int) – HTTP 상태 코드

  • $reason (string) – 선택적 이유 문구입니다.

반환:

현재 응답 인스턴스

반환 형식:

CodeIgniter\HTTP\Response

이 응답과 함께 전송되어야 하는 HTTP 상태 코드를 설정합니다.

<?php

$response->setStatusCode(404);

이유 문구는 공식 목록을 기반으로 자동 생성됩니다. 사용자 정의 상태 코드를 직접 설정해야 하는 경우 이유 문구를 두 번째 매개변수로 전달할 수 있습니다.

<?php

$response->setStatusCode(230, 'Tardis initiated');
getReasonPhrase()
반환:

현재 이유 문구입니다.

반환 형식:

string

이 응답의 현재 상태 코드를 반환합니다. 상태가 설정되지 않은 경우 빈 문자열을 반환합니다.

<?php

echo $response->getReasonPhrase();
setDate($date)
매개변수:
  • $date (DateTime) – 이 응답에 대해 설정할 시간이 있는 DateTime 인스턴스입니다.

반환:

현재 응답 인스턴스입니다.

반환 형식:

CodeIgniter\HTTP\Response

이 응답에 사용되는 날짜를 설정합니다. $date 인수는 DateTime의 인스턴스여야 합니다.

setContentType($mime[, $charset='UTF-8'])
매개변수:
  • $mime (string) – 이 응답이 나타내는 콘텐츠 유형입니다.

  • $charset (string) – 이 응답이 사용하는 문자 집합입니다.

반환:

현재 응답 인스턴스입니다.

반환 형식:

CodeIgniter\HTTP\Response

이 응답이 나타내는 콘텐츠 유형을 설정합니다.

<?php

$response->setContentType('text/plain');
$response->setContentType('text/html');
$response->setContentType('application/json');

기본적으로 이 메서드는 문자 집합을 UTF-8로 설정합니다. 이를 변경해야 하는 경우 문자 세트를 두 번째 매개변수로 전달할 수 있습니다.

<?php

$response->setContentType('text/plain', 'x-pig-latin');
noCache()
반환:

현재 응답 인스턴스입니다.

반환 형식:

CodeIgniter\HTTP\Response

모든 HTTP 캐싱을 끄도록 Cache-Control 헤더를 설정합니다. 이는 모든 응답 메시지의 기본 설정입니다.

<?php

$response->noCache();
/*
 * Sets the following header:
 * Cache-Control: no-store, max-age=0, no-cache
 */
setCache($options)
매개변수:
  • $options (array) – 키/값 캐시 제어 설정의 배열

반환:

현재 응답 인스턴스입니다.

반환 형식:

CodeIgniter\HTTP\Response

ETagsLast-Modified을 포함하여 Cache-Control 헤더를 설정합니다. 일반적인 키는 다음과 같습니다.

  • 에태그

  • 마지막으로 수정된

  • 최대 연령

  • s-최대

  • 사적인

  • 공공의

  • 재검증 필수

  • 프록시 재검증

  • 변환 없음

마지막 수정 옵션을 전달할 때 날짜 문자열이거나 DateTime 객체일 수 있습니다.

setLastModified($date)
매개변수:
  • $date (string|DateTime) – Last-Modified 헤더를 설정할 날짜

반환:

현재 응답 인스턴스입니다.

반환 형식:

CodeIgniter\HTTP\Response

Last-Modified 헤더를 설정합니다. $date 개체는 문자열이거나 DateTime 인스턴스일 수 있습니다.

<?php

$response->setLastModified(date('D, d M Y H:i:s'));
$response->setLastModified(\DateTime::createFromFormat('!U', $timestamp));
send() Response
반환:

현재 응답 인스턴스입니다.

반환 형식:

CodeIgniter\HTTP\Response

모든 것을 클라이언트에게 다시 보내도록 응답에 지시합니다. 그러면 먼저 헤더가 전송되고 그 뒤에 응답 본문이 전송됩니다. 기본 애플리케이션 응답의 경우 CodeIgniter에 의해 자동으로 처리되므로 이를 호출할 필요가 없습니다.

setCookie($name = ''[, $value = ''[, $expire = 0[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = false[, $httponly = false[, $samesite = null]]]]]]]])
매개변수:
  • $name (array|Cookie|string) – 쿠키 이름 또는 이 메소드에 사용 가능한 모든 매개변수의 연관 배열 또는 CodeIgniter\Cookie\Cookie의 인스턴스

  • $value (string) – 쿠키 값

  • $expire (int) – 쿠키 만료 시간(초)입니다. 0으로 설정하면 쿠키는 브라우저가 열려 있는 동안에만 지속됩니다.

  • $domain (string) – 쿠키 도메인

  • $path (string) – 쿠키 경로

  • $prefix (string) – 쿠키 이름 접두사. ''으로 설정하면 app/Config/Cookie.php의 기본값이 사용됩니다.

  • $secure (bool) – HTTPS를 통해서만 쿠키를 전송할지 여부입니다. null으로 설정하면 app/Config/Cookie.php의 기본값이 사용됩니다.

  • $httponly (bool) – HTTP 요청(JavaScript 없음)에 대해서만 쿠키에 액세스할 수 있도록 할지 여부입니다. null으로 설정하면 app/Config/Cookie.php의 기본값이 사용됩니다.

  • $samesite (string) – SameSite 쿠키 매개변수의 값입니다. ''으로 설정하면 SameSite 속성이 쿠키에 설정되지 않습니다. null로 설정하면 app/Config/Cookie.php의 기본값이 사용됩니다.

반환 형식:

void

참고

v4.2.7 이전에는 버그로 인해 $secure$httponly의 기본값이 false였으며 app/Config/Cookie.php의 이러한 값은 사용되지 않았습니다.

Response 인스턴스에 지정한 값이 포함된 쿠키를 설정합니다.

쿠키를 설정할 수 있도록 이 메소드에 정보를 전달하는 방법에는 배열 메소드와 개별 ​​매개변수의 두 가지 방법이 있습니다.

배열 방법

이 방법을 사용하면 연관 배열이 첫 번째 매개변수로 전달됩니다.

<?php

$cookie = [
    'name'     => 'The Cookie Name',
    'value'    => 'The Value',
    'expire'   => 86500,
    'domain'   => '.some-domain.com',
    'path'     => '/',
    'prefix'   => 'myprefix_',
    'secure'   => true,
    'httponly' => false,
    'samesite' => 'Lax',
];

$response->setCookie($cookie);

namevalue만 필요합니다. 쿠키를 삭제하려면 value를 공백으로 설정하세요.

expire은 초 단위로 설정되며 현재 시간에 추가됩니다. 시간을 포함하지 말고 쿠키가 유효하기를 원하는 지금부터 몇 초만 포함하세요. expire이 0으로 설정되면 쿠키는 브라우저가 열려 있는 동안에만 지속됩니다.

참고

그러나 value이 빈 문자열로 설정되고 expire0로 설정되면 쿠키가 삭제됩니다.

사이트 요청 방식에 관계없이 사이트 전체 쿠키의 경우 domain에 마침표로 시작하는 URL을 추가하세요. 예: .your-domain.com

메소드가 루트 경로를 설정하므로 path은 일반적으로 필요하지 않습니다.

prefix은 서버에 대해 이름이 동일한 다른 쿠키와의 이름 충돌을 피해야 하는 경우에만 필요합니다.

secure 플래그는 true로 설정하여 보안 쿠키로 만들려는 경우에만 필요합니다.

samesite 값은 도메인과 하위 도메인 간에 쿠키가 공유되는 방식을 제어합니다. 허용되는 값은 'None', 'Lax', 'Strict' 또는 빈 문자열 ''입니다. 빈 문자열로 설정하면 기본 SameSite 속성이 설정됩니다.

이산 매개변수

원하는 경우 개별 매개변수를 사용하여 데이터를 전달하여 쿠키를 설정할 수 있습니다.

<?php

$response->setCookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly, $samesite);
deleteCookie($name = ''[, $domain = ''[, $path = '/'[, $prefix = '']]])
매개변수:
  • $name (mixed) – 쿠키 이름 또는 매개변수 배열

  • $domain (string) – 쿠키 도메인

  • $path (string) – 쿠키 경로

  • $prefix (string) – 쿠키 이름 접두사

반환 형식:

void

기존 쿠키를 삭제합니다.

참고

또한 쿠키 삭제를 위해 브라우저 쿠키를 설정합니다.

name만 필요합니다.

prefix은 서버에 대해 이름이 동일한 다른 쿠키와의 이름 충돌을 피해야 하는 경우에만 필요합니다.

해당 하위 집합에 대해서만 쿠키를 삭제해야 하는 경우 prefix을 제공하세요. 해당 도메인에 대해서만 쿠키를 삭제해야 하는 경우 domain 이름을 제공하세요. 해당 경로에 대해서만 쿠키를 삭제해야 하는 경우 path 이름을 제공하세요.

선택적 매개변수 중 하나라도 비어 있으면 적용되는 모든 항목에서 동일한 이름의 쿠키가 삭제됩니다.

예:

<?php

$response->deleteCookie($name);
hasCookie($name = ''[, $value = null[, $prefix = '']])
매개변수:
  • $name (mixed) – 쿠키 이름 또는 매개변수 배열

  • $value (string) – 쿠키 값

  • $prefix (string) – 쿠키 이름 접두사

반환 형식:

bool

응답에 지정된 쿠키가 있는지 확인합니다.

참고

name만 필요합니다. prefix이 지정되면 쿠키 이름 앞에 추가됩니다.

value이 지정되지 않으면 메서드는 명명된 쿠키가 있는지 확인합니다. value이 제공되면 메서드는 쿠키가 존재하는지, 그리고 규정된 값을 가지고 있는지 확인합니다.

예:

<?php

if ($response->hasCookie($name)) {
    // ...
}
getCookie($name = ''[, $prefix = ''])
매개변수:
  • $name (string) – 쿠키 이름

  • $prefix (string) – 쿠키 이름 접두사

반환 형식:

Cookie|Cookie[]|null

발견된 경우 명명된 쿠키 또는 null을 반환합니다. name이 제공되지 않으면 Cookie 개체의 배열을 반환합니다.

예:

<?php

$cookie = $response->getCookie($name);
getCookies()
반환 형식:

Cookie[]

현재 응답 인스턴스 내에 설정된 모든 쿠키를 반환합니다. 이는 현재 요청 중에만 설정하도록 특별히 지정한 쿠키입니다.