HTTP 응답(Responses)

Response 클래스는 호출 한 클라이언트에 적합한 메소드를 사용하여 HTTP 메시지 클래스를 확장합니다.

응답 작업

응답(Response) 클래스가 인스턴스화되어 컨트롤러로 전달됩니다. 응답 클래스는 $this->response를 통해 액세스할 수 있습니다. CodeIgniter가 헤더와 본문 전송을 담당하므로 클래스를 직접 만지게되는 경우는 드믑니다. 페이지가 요청한 내용을 성공적으로 만들면 좋습니다. 문제가 발생하거나 매우 특정한 상태 코드를 다시 보내거나 강력한 HTTP 캐싱을 활용해야 할 때 유용합니다.

출력 설정

스크립트 출력을 직접 설정해야 하고 자동으로 가져 오기 위해 CodeIgniter에 의존하지 않는 경우 setBody 메소드를 사용하여 수동으로 수행하십시오. 이것은 일반적으로 응답의 상태 코드 설정과 함께 사용됩니다

<?php

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

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

<?php

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

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

<?php

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

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

헤더 설정

응답에 대해 헤더를 설정해야 하는 경우가 종종 있습니다. 응답(Response) 클래스는 setHeader() 메소드를 사용하여 이것을 매우 간단하게 만듭니다. 첫 번째 매개 변수는 헤더의 이름입니다. 두 번째 매개 변수는 값으로, 클라이언트로 전송될 때 올바르게 결합될 문자열 또는 값의 배열입니다. 기본 PHP 함수를 사용하는 대신 이러한 함수를 사용하면 헤더가 조기에 전송되지 않아 오류가 발생하고 테스트할 수 있습니다.

<?php

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

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

<?php

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

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

<?php

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

강제 파일 다운로드

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

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

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

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

Example

<?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');

Note

다운로드가 클라이언트로 전송되려면 반드시 응답 객체를 반환해야합니다. 이를 통해 클라이언트로 전송되기 전에 모든 이후(after) 필터를 통해 응답을 전달할 수 있습니다.

HTTP 캐싱(Caching)

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 옵션은 해당 헤더에 지능적으로 처리합니다.

콘텐츠 보안 정책

XSS 공격에 대한 최선의 보호 방법 중 하나는 사이트에서 콘텐츠 보안 정책을 구현하는 것입니다. 이렇게하면 이미지, 스타일 시트, 자바 스크립트 파일 등 사이트의 HTML에서 가져온 모든 단일 컨텐츠 소스를 허용해야합니다. 브라우저는 화이트리스트에 맞지 않는 소스의 콘텐츠를 거부합니다. 이 화이트리스트는 응답의 Content-Security-Policy 헤더내에 생성되며 다양한 방법으로 구성할 수 있습니다.

이것은 복잡하게 들리며 일부 사이트에서는 확실히 어려울 수 있습니다. 그러나 모든 콘텐츠가 동일한 도메인(http://example.com)에 의해 제공되는 여러 간단한 사이트의 경우 통합이 매우 간단합니다.

이 주제는 복잡한 주제이므로 이 가이드에서는 모든 세부 사항을 다루지는 않습니다. 자세한 내용은 다음 사이트를 방문하십시오:

CSP 켜기

기본적으로 이 기능은 꺼져있습니다. 어플리케이션에서 지원을 활성화하려면 app/Config/App.php에서 CSPEnabled 값을 수정하십시오.

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class App extends BaseConfig
{
    public $CSPEnabled = true;

    // ...
}

활성화되면 응답 객체에 CodeIgniter\HTTP\ContentSecurityPolicy 인스턴스가 포함됩니다. app/Config/ContentSecurityPolicy.php에 설정된 값이 해당 인스턴스에 적용되며 런타임동안 변경이 필요하지 않으면 올바른 형식의 헤더가 전송되고 모든 작업이 완료됩니다.

CSP를 사용하면 두 개의 헤더 행이 HTTP 응답에 추가됩니다: 다양한 컨텍스트에 대해 명시적으로 허용되는 컨텐츠 유형 또는 출처를 식별하는 정책이 포함된 Content-Security-Policy 헤더와 허용되지만 허용될 컨텐츠 유형 또는 출처를 식별하는 Content-Security-Policy-Report-Only 헤더.

우리의 구현은 reportOnly() 메소드를 통해 변경 가능한 기본 처리를 제공합니다. CSP 지시문에 추가 항목을 추가하면 아래와 같이 차단 또는 방지에 적합한 CSP 헤더가 추가됩니다. 추가 메소드 호출에 선택적 두 번째 매개 변수를 제공하여 호출마다 대체할 수 있습니다.

런타임 구성

어플리케이션이 런타임중에 변경해야 하는 경우 컨트롤러의 $this->response->CSP를 통하여 인스턴스에 액세스 할 수 있습니다. 이 클래스에는 설정해야 할 적절한 헤더 값에 매우 명확하게 매핑되는 많은 메소드가 있습니다. 아래 예제는 모두 지시어 이름과 일련의 매개 변수로 표시하지만 이들은 모두 배열을 허용합니다.

<?php

// specify the default directive treatment
$this->response->CSP->reportOnly(false);

// specify the origin to use if none provided for a directive
$this->response->CSP->setDefaultSrc('cdn.example.com');

// specify the URL that "report-only" reports get sent to
$this->response->CSP->setReportURI('http://example.com/csp/reports');

// specify that HTTP requests be upgraded to HTTPS
$this->response->CSP->upgradeInsecureRequests(true);

// add types or origins to CSP directives
// assuming that the default treatment is to block rather than just report
$this->response->CSP->addBaseURI('example.com', true); // report only
$this->response->CSP->addChildSrc('https://youtube.com'); // blocked
$this->response->CSP->addConnectSrc('https://*.facebook.com', false); // blocked
$this->response->CSP->addFontSrc('fonts.example.com');
$this->response->CSP->addFormAction('self');
$this->response->CSP->addFrameAncestor('none', true); // report this one
$this->response->CSP->addImageSrc('cdn.example.com');
$this->response->CSP->addMediaSrc('cdn.example.com');
$this->response->CSP->addManifestSrc('cdn.example.com');
$this->response->CSP->addObjectSrc('cdn.example.com', false); // reject from here
$this->response->CSP->addPluginType('application/pdf', false); // reject this media type
$this->response->CSP->addScriptSrc('scripts.example.com', true); // allow but report requests from here
$this->response->CSP->addStyleSrc('css.example.com');
$this->response->CSP->addSandbox(['allow-forms', 'allow-scripts']);

각 “add” 메소드에 대한 첫 번째 매개 변수는 적절한 문자열 또는 배열입니다.

reportOnly 메소드를 사용하면 재정의하지 않는 한 후속 소스에 대한 기본 보고 처리를 지정할 수 있습니다. 예를 들어 youtube.com을 허용하도록 지정한 다음, 허용되지만 보고하는 다른 소스를 여러 개 제공할 수 있습니다.

<?php

$this->response->CSP->addChildSrc('https://youtube.com'); // allowed
$this->response->CSP->reportOnly(true);
$this->response->CSP->addChildSrc('https://metube.com'); // allowed but reported
$this->response->CSP->addChildSrc('https://ourtube.com', false); // allowed

인라인 컨텐츠

인라인 스크립트 및 스타일은 사용자 생성 컨텐츠의 결과일 수 있기 때문에 보호하지 않도록 웹 사이트를 설정할 필요가 있습니다. <style><script> 태그에 {csp-style-nonce} 또는 {csp-script-nonce} 자리 표시자를 포함하면 자동으로 간단하게 처리됩니다.

// Original
<script {csp-script-nonce}>
    console.log("Script won't run as it doesn't contain a nonce attribute");
</script>

// Becomes
<script nonce="Eskdikejidojdk978Ad8jf">
    console.log("Script won't run as it doesn't contain a nonce attribute");
</script>

// OR
<style {csp-style-nonce}>
    . . .
</style>

Warning

공격자가 <script {csp-script-nonce}>와 같은 문자열을 삽입하면 이 기능으로 실제 nonce 속성이 될 수 있습니다. app/Config/ContentSecurityPolicy.php에서 $scriptNonceTag$styleNonceTag 속성을 사용하여 자리 표시자 문자열을 사용자 정의할 수 있습니다.

이 자동 교체 기능이 마음에 들지 않으면 app/Config/ContentSecurityPolicy.php에서 $autoNonce = false를 설정하여 이 기능을 끌 수 있습니다.

이 경우 csp_script_nonce()csp_style_nonce() 함수를 사용할 수 있습니다.

// Original
<script <?= csp_script_nonce() ?>>
    console.log("Script won't run as it doesn't contain a nonce attribute");
</script>

// Becomes
<script nonce="Eskdikejidojdk978Ad8jf">
    console.log("Script won't run as it doesn't contain a nonce attribute");
</script>

// OR
<style <?= csp_style_nonce() ?>>
    . . .
</style>

Class Reference

Note

여기에 나열된 메소드 외에 이 클래스는 메시지 클래스의 메소드를 상속합니다..

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

  • 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()
Returns

HTTP 상태 코드

Return type

int

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

<?php

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

  • $reason (string) – 이유 문구

Returns

Response 인스턴스

Return type

CodeIgniterHTTPResponse

응답과 함께 보내야하는 HTTP 상태 코드를 설정합니다.

<?php

$response->setStatusCode(404);

이유 문구는 공식 목록에 따라 자동으로 생성됩니다. 사용자 정의 상태 코드에 대한 고유한 설정이 필요한 경우 이유 문구를 두 번째 매개 변수로 전달할 수 있습니다.

<?php

$response->setStatusCode(230, 'Tardis initiated');
getReasonPhrase()
Returns

이유 문구.

Return type

string

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

<?php

echo $response->getReasonPhrase();
setDate($date)
Parameters
  • $date (DateTime) – 응답에 설정할 DateTime 인스턴스

Returns

response 인스턴스.

Return type

CodeIgniterHTTPResponse

응답에 사용될 날짜를 설정합니다. The $dateDateTime의 인스턴스여야 합니다.

setContentType($mime[, $charset='UTF-8'])
Parameters
  • $mime (string) – 응답의 컨텐츠 유형

  • $charset (string) – 응답이 사용하는 문자 세트

Returns

response 인스턴스.

Return type

CodeIgniterHTTPResponse

응답의 내용 유형을 설정합니다.

<?php

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

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

<?php

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

response 인스턴스.

Return type

CodeIgniterHTTPResponse

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

<?php

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

Returns

response 인스턴스.

Return type

CodeIgniterHTTPResponse

ETagsLast-Modified를 포함하여 Cache-Control 헤더를 설정합니다. 대표적으로 많이 사용되는 키:

  • etag

  • last-modified

  • max-age

  • s-maxage

  • private

  • public

  • must-revalidate

  • proxy-revalidate

  • no-transform

last-modified 옵션은 날짜 문자열 또는 DateTime 개체일 수 있습니다.

setLastModified($date)
Parameters
  • $date (string|DateTime) – Last-Modified 헤더를 설정할 날짜

Returns

response 인스턴스.

Return type

CodeIgniterHTTPResponse

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

<?php

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

response 인스턴스.

Return type

CodeIgniterHTTPResponse

모든것을 클라이언트로 다시 보내도록 응답(Response)에 지시합니다. 먼저 헤더를 보낸 다음 응답 본문을 보냅니다. 어플리케이션의 기본 응답인 경우 CodeIgniter에서 자동으로 처리하므로 이를 호출할 필요가 없습니다.

setCookie($name = ''[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = false[, $httponly = false[, $samesite = null]]]]]]]])
Parameters
  • $name (array|Cookie|string) – 쿠키명 또는 매개 변수 배열

  • $value (string) – 쿠키값

  • $expire (int) – 쿠키 만료 시간(초)

  • $domain (string) – 쿠키 domain

  • $path (string) – 쿠키 path

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

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

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

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

Return type

void

Note

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

지정한 값이 포함된 쿠키를 설정합니다. 이 메소드로 쿠키를 설정 정보를 전달할 때 연관 배열과 개별 매개 변수(Discrete Parameters) 두 가지 방법을 사용할 수 있습니다.

연관 배열

연관 배열을 첫 번째 매개 변수로 전달합니다.

<?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);

이름과 값만 필요합니다. 쿠키를 삭제하려면 expire를 공백(blank)으로 쿠키를 설정하십시오.

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

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

메소드가 루트 경로를 설정하므로 일반적으로 path는 설정하지 않아도 됩니다.

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

보안 쿠키를 만들고 싶다면 secure의 값을 부울(boolean) true로 설정합십시오.

SameSite 값은 도메인과 하위 도메인 간에 쿠키가 공유되는 방식을 제어합니다. 허용되는 값은 None, Lax, Strict 또는 빈 문자열 ''입니다. 빈 문자열('')로 설정하면 클라이언트로 보낸 쿠키에 SameSite 속성이 설정되지 않습니다. null로 설정하면 config/App.php의 값이 사용됩니다.

개별 매개 변수

개별 매개 변수를 사용하여 쿠키를 설정할 수 있습니다.

<?php

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

  • $domain (string) – 쿠키 domain

  • $path (string) – 쿠키 path

  • $prefix (string) – 쿠키명 prefix

Return type

void

expire0으로 설정하여 기존 쿠키를 삭제합니다.

Notes

name만 필요합니다.

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

  • 해당 하위 집합에 대해서만 쿠키를 삭제해야 하는 경우 prefix를 제공하십시오.

  • 해당 도메인에 대해서만 쿠키를 삭제해야 하는 경우 domain을 제공하십시오.

  • 해당 경로에 대해서만 쿠키를 삭제해야 하는 경우 path를 제공하십시오.

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

Example

<?php

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

  • $value (string) – 쿠키값

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

Return type

bool

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

Notes

name만 필요합니다. prefix가 지정되면 쿠키명 앞에 붙습니다.

value가 제공되지 않으면, 메소드는 이름으로 지정된 쿠키가 있는지 확인합니다. value가 제공되면, 메소드는 쿠키가 존재하는지, 제공된 값을 가지고 있는지 확인합니다.

Example

<?php

if ($response->hasCookie($name)) {
    // ...
}
getCookie($name = ''[, $prefix = ''])
Parameters
  • $name (mixed) – 쿠키명

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

Return type

Cookie|Cookie[]|null

name이 지정된 쿠키(있는 경우) 또는 null을 반환합니다.

name이 없으면 Cookie 객체의 배열을 반환합니다.

Example

<?php

$cookie = $response->getCookie($name);
getCookies()
Return type

Cookie[]

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