Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Feb 12, 2021 - コメント - 日記

traefik配下のサービスにCORSを設定する

traefik配下のサービスでAPIを提供するときに、ブラウザに対しCORSによるアドバイスを行います。

以下のような設定でexample.comと言うサービスに対して、https://example.comおよびhttps://www.example.comからの接続をアドバイスします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    labels:
      - "traefik.http.routers.example_com.rule=Host(`example.com`)"
      - "traefik.http.routers.example_com.tls=true"
      - "traefik.http.routers.example_com.tls.certresolver=dnsresolver"
      - "traefik.http.routers.example_com.tls.domains[0].main=example.com"
      - "traefik.http.routers.example_com.middlewares=example_com_headers@docker"
      - "traefik.http.middlewares.example_com_headers.headers.accesscontrolallowheaders=*"
      - "traefik.http.middlewares.example_com_headers.headers.accesscontrolallowmethods=GET,POST,OPTIONS"
      - "traefik.http.middlewares.example_com_headers.headers.accesscontrolalloworiginlist=https://example.com,https://www.example.com"
      - "traefik.http.middlewares.example_com_headers.headers.accesscontrolmaxage=100"
      - "traefik.http.middlewares.example_com_headers.headers.addvaryheader=true"

www.example.comからのアクセスがCORS設定されているか確認するに以下ののようにします。

curl -i -H "Origin: www.example.com" -X OPTIONS https://example.com

設定されていれば以下のように出力されます

HTTP/2 204
access-control-allow-headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
access-control-allow-methods: GET, POST, OPTIONS
access-control-allow-origin: https://www.example.com
(略)

テストで使った、-X OPTIONSというのはプリフライトリクエストという特殊なリクエストで本来はブラウザが、APIアクセスが安全かどうかをサーバ側にお伺い立てるものです。