CORS 미들웨어
Cloudflare Workers를 웹 API로 사용하고 외부 프론트엔드 애플리케이션에서 호출하는 다양한 사례가 있다. 이를 위해 CORS를 구현해야 한다. 미들웨어를 사용하여 이 작업을 수행해보자.
Import
ts
import { Hono } from 'hono'
import { cors } from 'hono/cors'사용 방법
ts
const app = new Hono()
// CORS는 라우트보다 먼저 호출해야 한다
app.use('/api/*', cors())
app.use(
'/api2/*',
cors({
origin: 'http://example.com',
allowHeaders: ['X-Custom-Header', 'Upgrade-Insecure-Requests'],
allowMethods: ['POST', 'GET', 'OPTIONS'],
exposeHeaders: ['Content-Length', 'X-Kuma-Revision'],
maxAge: 600,
credentials: true,
})
)
app.all('/api/abc', (c) => {
return c.json({ success: true })
})
app.all('/api2/abc', (c) => {
return c.json({ success: true })
})여러 오리진 허용:
ts
app.use(
'/api3/*',
cors({
origin: ['https://example.com', 'https://example.org'],
})
)
// 또는 "함수"를 사용할 수 있다
app.use(
'/api4/*',
cors({
// `c`는 `Context` 객체
origin: (origin, c) => {
return origin.endsWith('.example.com')
? origin
: 'http://example.com'
},
})
)옵션
optional origin: string | string[] | (origin:string, c:Context) => string
"Access-Control-Allow-Origin" CORS 헤더의 값을 설정한다. origin: (origin) => (origin.endsWith('.example.com') ? origin : 'http://example.com')과 같은 콜백 함수를 전달할 수도 있다. 기본값은 *이다.
optional allowMethods: string[]
CORS 헤더인 "Access-Control-Allow-Methods"의 값을 설정한다. 기본값은 ['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH']이다.
optional allowHeaders: string[]
CORS 헤더인 "Access-Control-Allow-Headers"의 값을 설정한다. 기본값은 []이다.
선택 사항 maxAge: number
"Access-Control-Max-Age" CORS 헤더의 값을 설정한다.
선택 사항 credentials: boolean
CORS 헤더인 "Access-Control-Allow-Credentials"의 값을 나타낸다.
optional exposeHeaders: string[]
CORS 헤더 중 "Access-Control-Expose-Headers"의 값을 설정한다. 기본값은 []이다.
환경에 따른 CORS 설정
개발 환경과 프로덕션 환경 등 실행 환경에 따라 CORS 설정을 조정하려면, 환경 변수에서 값을 주입하는 방식이 편리하다. 이 방법은 애플리케이션이 자신의 실행 환경을 알 필요가 없게 해준다. 아래 예제를 참고한다.
ts
app.use('*', async (c, next) => {
const corsMiddlewareHandler = cors({
origin: c.env.CORS_ORIGIN,
})
return corsMiddlewareHandler(c, next)
})