CORS
필수 의존성: io.ktor:ktor-server-cors
코드 예제: cors
서버가 교차 출처 요청(cross-origin requests)을 처리해야 하는 경우, CORS Ktor 플러그인을 설치하고 설정해야 합니다. 이 플러그인을 사용하면 허용된 호스트, HTTP 메서드, 클라이언트가 설정한 헤더 등을 구성할 수 있습니다.
의존성 추가
CORS을 사용하려면 빌드 스크립트에 ktor-server-cors 아티팩트를 포함해야 합니다:
CORS 설치
애플리케이션에 CORS 플러그인을 설치하려면, 지정된
install 함수에 전달하세요. 아래 코드 스니펫은 CORS을 설치하는 방법을 보여줍니다... - ...
embeddedServer함수 호출 내부에서. - ...
Application클래스의 확장 함수로 명시적으로 정의된module내부에서.
CORS 플러그인은 특정 경로(route)에 설치할 수도 있습니다. 이는 서로 다른 애플리케이션 리소스에 대해 서로 다른 CORS 설정이 필요한 경우 유용할 수 있습니다.
CORS플러그인을 특정 경로에 설치하는 경우, 해당 경로에options핸들러를 추가해야 합니다. 이를 통해 Ktor가 CORS 프리플라이트(preflight) 요청에 올바르게 응답할 수 있습니다.
CORS 설정
CORS 전용 구성 설정은 CORSConfig 클래스에 의해 노출됩니다. 이러한 설정을 구성하는 방법을 알아보겠습니다.
개요
8080 포트에서 대기 중인 서버가 있고, /customer 경로(route)가 JSON 데이터로 응답한다고 가정해 보겠습니다. 아래 코드 스니펫은 교차 출처 요청을 만들기 위해 다른 포트에서 작동하는 클라이언트가 Fetch API를 사용하여 만든 샘플 요청을 보여줍니다:
function saveCustomer() {
fetch('http://0.0.0.0:8080/customer',
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "POST",
body: JSON.stringify({id: 3, firstName: "Jet", lastName: "Brains"})
})
.then(response => response.text())
.then(data => {
console.log('Success:', data);
alert(data);
})
.catch((error) => {
console.error('Error:', error);
});
}백엔드 측에서 이러한 요청을 허용하려면 다음과 같이 CORS 플러그인을 설정해야 합니다:
install(CORS) {
allowHost("0.0.0.0:8081")
allowHeader(HttpHeaders.ContentType)
}전체 예제는 여기에서 확인할 수 있습니다: cors.
호스트
교차 출처 요청을 할 수 있는 허용된 호스트를 지정하려면 allowHost 함수를 사용하세요. 호스트 이름 외에도 포트 번호, 서브도메인 목록 또는 지원되는 HTTP 스키마를 지정할 수 있습니다.
install(CORS) {
allowHost("client-host")
allowHost("client-host:8081")
allowHost("client-host", subDomains = listOf("en", "de", "es"))
allowHost("client-host", schemes = listOf("http", "https"))
}모든 호스트로부터의 교차 출처 요청을 허용하려면 anyHost 함수를 사용하세요.
install(CORS) {
anyHost()
}HTTP 메서드
기본적으로 CORS 플러그인은 GET, POST, HEAD HTTP 메서드를 허용합니다. 추가 메서드를 추가하려면 allowMethod 함수를 사용하세요.
install(CORS) {
allowMethod(HttpMethod.Options)
allowMethod(HttpMethod.Put)
allowMethod(HttpMethod.Patch)
allowMethod(HttpMethod.Delete)
}헤더 허용
기본적으로 CORS 플러그인은 Access-Control-Allow-Headers에 의해 관리되는 다음과 같은 클라이언트 헤더를 허용합니다:
AcceptAccept-LanguageContent-Language
추가 헤더를 허용하려면 allowHeader 함수를 사용하세요.
install(CORS) {
allowHeader(HttpHeaders.ContentType)
allowHeader(HttpHeaders.Authorization)
}사용자 정의 헤더를 허용하려면 allowHeaders 또는 allowHeadersPrefixed 함수를 사용하세요. 예를 들어, 아래 코드 스니펫은 custom-으로 시작하는 헤더를 허용하는 방법을 보여줍니다.
install(CORS) {
allowHeadersPrefixed("custom-")
}
allowHeaders또는allowHeadersPrefixed를 사용하여 단순하지 않은(non-simple) 콘텐츠 타입을 허용하려면 allowNonSimpleContentTypes 속성을true로 설정해야 합니다.
헤더 노출
Access-Control-Expose-Headers 헤더는 브라우저의 JavaScript가 접근할 수 있는 허용 목록에 지정된 헤더를 추가합니다. 이러한 헤더를 구성하려면 exposeHeader 함수를 사용하세요.
install(CORS) {
// ...
exposeHeader("X-My-Custom-Header")
exposeHeader("X-Another-Custom-Header")
}자격 증명
기본적으로 브라우저는 교차 출처 요청 시 자격 증명 정보(쿠키 또는 인증 정보 등)를 보내지 않습니다. 이 정보의 전달을 허용하려면 allowCredentials 속성을 사용하여 Access-Control-Allow-Credentials 응답 헤더를 true로 설정하세요.
install(CORS) {
allowCredentials = true
}기타 설정
CORS 플러그인을 사용하면 다른 CORS 관련 설정도 지정할 수 있습니다. 예를 들어, maxAgeInSeconds를 사용하여 다른 프리플라이트 요청을 보내지 않고 프리플라이트 요청에 대한 응답을 캐시할 수 있는 시간을 지정할 수 있습니다.
install(CORS) {
maxAgeInSeconds = 3600
}기타 구성 옵션에 대해서는 CORSConfig에서 확인할 수 있습니다.
