🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ドメイン

ドメインとは本来、領域や範囲の意味を持ち、インターネット上では特定の部分領域を指します。ネットワークやコンピュータの識別に利用され、所得することでホームページを公開したり、メールアドレスを作成できます。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

5回答

4161閲覧

クロスドメイン制約なしでクライアントサイドを作るには

nikkori

総合スコア20

ドメイン

ドメインとは本来、領域や範囲の意味を持ち、インターネット上では特定の部分領域を指します。ネットワークやコンピュータの識別に利用され、所得することでホームページを公開したり、メールアドレスを作成できます。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

2クリップ

投稿2019/10/04 00:10

WebAPIをたたくWeb画面を作成しています。
ajax通信でAPIを叩くjsのプログラムなのですが、そのままではクロスドメイン制約に引っかかるので、本番利用のときはサーバーと同一ドメインに配置させてもらう予定でした。
が、サーバー側エンジニアのNGがでたためAPIと同じサーバーにはおけず、別サーバーをたてることになりました。
サーバー側のCORS対応もNGとのことです・・・。

そこで質問です。
1.別サーバーを立てた場合、メインドメインが同じならサブドメインが異なっていてもクロスドメイン制約にはひっかからないでしょうか?下記のようなイメージです。

  • サーバー側ドメイン:api.xxxx.com
  • クライアント側ドメイン:www.xxxx.com

2.もし1.がだめな場合、クライアントサイドをajax通信以外で開発し直す必要があります。
他にどのような言語、フレームワークを使うことが考えられるでしょうか?
クライアントサイドの開発知識がほぼないので、html,css,jsだけの単純な作りしか思いつかず。
ASP.net(C#)あたりならできるのかなと思いますが、開発コストが増えそうなので他に手段がないか調べています。
機能的にはAPIをたたいてレスポンスをキレイに加工して出す単純なものです。

1.で問題なければプログラムは変更しなくていいのですが、だめな場合他の方法を考えなければなりません。
WebサーバーとAPIサーバーが異なることはよくあると思うので、一般的にはどう解決しているのだろう?と疑問に思い質問させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/10/04 00:37

どのような事情で「サーバー側エンジニアのNG」になったのかが気になります(キーなどが必要で、そもそもフロントから使うのが不適当なAPI、ということはありませんか?)。
nikkori

2019/10/04 00:57

顧客要望でAPIをASPサービスのように画面で使えるようにしたいという対応になったのですが、 その方針に反対で一切協力しない姿勢です。。。 デモ用につくったswiftのアプリでは問題なくAPIがたたけていたので、同じようにjsで作ったのですが クロスドメイン制約にハマってしまっています。
guest

回答5

0

ベストアンサー

1.別サーバーを立てた場合、メインドメインが同じならサブドメインが異なっていてもクロスドメイン制約にはひっかからないでしょうか?下記のようなイメージです。

「サーバー側のCORS対応もNG」ならクロスドメイン制約にひっかかります。

2.もし1.がだめな場合、クライアントサイドをajax通信以外で開発し直す必要があります。

jsonp使うしかないのでは?
セキュリティのレベルは落ちますがね。。。

(google.com)jsonp

サーバーサイドのAPIでのjsonp対応も必須になります。
というか、APIでjsonp対応できるのなら、「サーバー側のCORS対応」(APIでAccess-Control-Allow-Origin ヘッダー適切に返すことができると思います。

WebサーバーとAPIサーバーが異なることはよくあると思うので、一般的にはどう解決しているのだろう?と疑問に思い

一般的には「サーバー側のCORS対応」を行います。

投稿2019/10/04 00:25

Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2019/10/04 00:31

> サーバー側エンジニアのNGがでたためAPIと同じサーバーにはおけず、別サーバーをたてることになりました。サーバー側のCORS対応もNGとのことです・・・。 もし、サーバー側(APIの持ち主・開発者)だということだとすると、どこからも使えないAPIを置いて何したいんだろう???という疑問が・・・
nikkori

2019/10/04 00:46

サーバー側のエンジニアが難しい方なので私の理解が間違っているのかもしれません。。 CORS対応をしないというより、今の仕様は変えないソース等は開示しない!という主義なのです。 ajax通信しようとすると制約に引っかかるのでCORS対応されていないのだと私が解釈していました。 APIはブラウザに直接URLいれれば使えますし、swiftアプリを作って叩いたときも使えました。 これはCORS対応されているということなんでしょうか・・? 理解ができてなくて申し訳ないです。
Y.H.

2019/10/04 00:55

> ブラウザに直接URL これはCORSとは何の関係もなくリクエスト可能です。 >swiftアプリを作って叩いた これも「ブラウザに直接URL」と全く同じです。 CORSはブラウザがスクリプトで行う XMLHttpRequestなどによるリクエストに適用されます。 詳しくは以下をお読みください。 https://developer.mozilla.org/ja/docs/Web/HTTP/CORS >ブラウザーは、スクリプトによって開始されるオリジン間 HTTP リクエストを制限しています。 >例えば、 XMLHttpRequestや Fetch API は同一オリジンポリシーsame-origin policyに従います。 >つまり、これらの API を使用するウェブアプリケーションは、そのアプリケーションが読み込まれた >のと同じオリジンからのみ HTTP リソースのリクエストを行うことができ、それ以外のオリジンから >の場合は正しい CORS ヘッダーを含んでいることが必要です。
nikkori

2019/10/04 01:26 編集

ありがとうございます。 なかなか難しくて頭から煙出そうですが、なんとかサーバー側のエンジニアと会話できるまで理解度をあげようと思います。 本APIはすでに運用されているので、今のユーザーはサーバープログラムのなかでAPI通信して問題なく動いているのだとおもいます。 ただブラウザでも見れるようにするにはCORS対応をしてもらうべきというのが一般的な対応、という理解です。 もし間違っていたらご指摘ください。
Y.H.

2019/10/04 01:48

apiのサーバーサイドの変更を一切なしで対応することはできません。(もしできたらCORSの意味がなくなります。)(最後の手段としてはtanatさんの回答にある「踏み台プログラムを作ってサーバサイド通信をさせる」がありますが・・・) apiのレスポンスをjsonpに変更する。または、Access-Control-Allow-Origin ヘッダーを適切に返すように変更する。のどちらかです。
nikkori

2019/10/04 02:30

ありがとうございます。他の方の回答からも正攻法で行けばサーバー側の変更をするべきということ、すでに運用されているAPIなので仕様変更するのは難しく、リスクも高いということがわかってきました。 GUI化すること自体を軽く考えていたフシがあるので、皆さんからのレスポンスをしっかり理解してチーム全体で再検討してみます。
guest

0

その方針に反対で一切協力しない姿勢です。。。

まずはそれを解決するのが先決です。技術的に無理やり突破したところで、本来不必要な技術的負債を抱え込むことになりますし、最悪の場合はサーバサイドの変更で動かなくなる、という危険もあります。

投稿2019/10/04 01:02

maisumakun

総合スコア145977

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikkori

2019/10/04 01:07

ありがとうございます。おっしゃるとおりですね。 王道の手段はサーバー側で対応することだと皆さんの回答でもわかったので、もう一度相談してみることにします。
m.ts10806

2019/10/04 01:44

>不必要な技術的負債 ここが発生した際に「どこがコストを担保するか」まで考えておかないと最悪の事態になりかねません。 (なので、maisumkunさんがコメントしているように今解決すべき)
nikkori

2019/10/04 02:20

そうですよね。正直そこまで考えておらず、ブラウザで直接叩いたものをキレイに加工する程度でしょ、という要望だったので、見解をだしてチームで再検討するように促してみようと思います。
nikkori

2019/10/04 03:00

そもそも、同一ドメイン(サーバー)内にプログラムを置いてもらえればそれで解決するのではないかと思い至りました。まずはそこを再度検討して、説得してみようと思います。
guest

0

CORS も JSONP もダメと言うことですと、ブラウザから AJAX で別ドメインの API にアクセスするのは無理と思います(少なくとも自分は解決策は分かりません)。

なので質問 2 の、

ASP.net(C#)あたりならできるのかなと思いますが、
機能的にはAPIをたたいてレスポンスをキレイに加工して出す単純なものです。

についてレスします。

ASP.NET でもクライアントが使うのはブラウザなので、それからクロスドメインの API に AJAX で要求を出すことは、CORS も JSONP もダメならできません。

なので、ブラウザからクロスドメインの API に AJAX で要求を出すのではなく、サーバー側で HttpWebRequest / HttpWebResponse などを使って API に要求を出して情報を取得し、その情報を元に「レスポンスをキレイに加工して」クライアント(ブラウザ)に返してやるという方法が考えられます。

具体的には以下のような構成にするということです。

クライアント(ブラウザ)⇔ ASP.NET Web ページ ⇔ コードビハインドの HttpWebRequest ⇔ クロスドメインの API

同等のことができる Web アプリであれば ASP.NET である必要はないです。

投稿2019/10/04 01:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikkori

2019/10/04 02:17

ありがとうございます。やはり王道はサーバー側の変更なんですね。。 ASP.NETは5年以上前ですが扱ったことがあるので、できるのではないかと思って書きました。 ただサーバープログラムも作るとなるとやはり開発コストは増えそうなので、一旦見解をまとめて方針をチームに共有してみます。
guest

0

開発者が手軽にやるなら、
ブラウザ側のセキュリティ設定で対応
(ブラウザごとに)
出来ますが、本番で別サーバで別ドメインにAPIがあるなら

jsと同じドメインのサーバに簡単な踏み台プログラムを作ってサーバサイド通信をさせる。
jsからは踏み台をAPIのエンドポイントにする

かなあ。

そもそもフロントから叩くAPIとして作られてないとかだとこういうケースはありますね。。。

投稿2019/10/04 00:29

編集2019/10/04 00:37
tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikkori

2019/10/04 00:37

ありがとうございます。そうですよね。 開発時にはブラウザ側の設定を変えて対応できていたのですが、本番では難しそうです・・・
tanat

2019/10/04 00:41

APIの仕様を変更できるならjsonpで対応、出来ないなら踏み台を作るしかない状況ですね。。
nikkori

2019/10/04 01:28

踏み台を作るという実装も興味ありますが、他の方の回答をみてまずは王道でサーバー側のエンジニアを説得するほうがよいという結論になりました。 APIをjsのプログラムで叩くだけなら簡単だと思っていたのですが、難しい問題があるものなんですね。。。 勉強になりました。
tanat

2019/10/04 01:47

既に動いているAPIという事であれば、 その仕様を変更するというのは必ずしも王道とは言えないかと思います。 (API管理者の責任範囲拡大とコストが発生することなので、本来的には設計時に伝えて予算を確保しないといけない) ので、そのあたりを相談するにしても、誰がどうコストと責任を負担するかまで根回ししておかないと難しい様に思いますよ。
tanat

2019/10/04 02:04

CORSを許可する=セキュリティ的には弱くなる なので、APIの管理者としては ・セキュリティ要件の見直し ・場合によっては脆弱性診断の再度実行 等など、設定自体の作業以外のコストが山の様に発生することになります。 よって、然るべき手続きと予算措置を持って依頼されない限りは「その方針に反対で一切協力しない姿勢です。。。」というのは(組織としては)正しい対応の様に思います。 ベストはこの辺を全てクリアしてAPI側で対応できるかを検討してもらって、対応する。 何らかの理由(例えば、外部ドメインからアクセスしてはいけない性質のAPIであるということはあり得ると思います。この場合、CORSを設定するのは不適当です) でそれが無理なら、新しく建てたサーバで踏み台を設置して、踏み台からのアクセスに関するコストと責任は全て踏み台サーバ管理者側の責任範囲とする あたりが落としどころになるのかなとは思います。
nikkori

2019/10/04 02:23

たしかにそうですね!APIとしては運用されているので、変更は難しいかもしれません。 根本的な問題なのだという認識がチーム全体になかったので、改めて見解を共有する必要がありそうです。
nikkori

2019/10/04 02:27

返信が入れ違いました。サーバーエンジニアはセキュリティ対策にかなり厳しいので、、、、完全NGを出した理由がやっとわかってきました。確かに簡単に考えてはいけないところですね。 むしろAPIを使わずにクライアント用のWebアプリを最初から作るのがベストなのではないかと思えてきました。
退会済みユーザー

退会済みユーザー

2019/10/04 02:39

> むしろAPIを使わずにクライアント用のWebアプリを最初から作るのがベストなのではないかと思えてきました。 これ、管理主管が変わるだけで根本的に何も解決しないですよ。
nikkori

2019/10/04 02:53

すみません、そうなんですか? 今あるAPIを叩きたいというのが根本ではなく、APIのレスポンスの一部(8割程度)をWeb画面で表示したいというのが最終的にやりたいことでした。 今あるAPIをたたいてブラウザに表示するだけ、と思っていたのですが今回の問題に直面した次第です。 APIの仕様を変えるのはリスクが高そうなので、最初からWeb画面用にプログラムを作成するほうがよいのではとおもったのですが…。
guest

0

JSONP APIで解決すればよいでしょう

投稿2019/10/04 00:25

yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikkori

2019/10/04 00:49

ありがとうございます。JSONPもサーバー側になんらかの対応が必要そうなので諦めていました。 あとAPIのレスポンスがjsonではなくxmlなので、できないのではないかと思い読み飛ばしていました。 レスポンスがjsonでなくても使えるのでしょうか。 根本的なハードルはサーバー側のエンジニアの説得のような気がしてきました・・・
yambejp

2019/10/04 00:56

> JSONPもサーバー側になんらかの対応が必要そうなので諦めていました 本当はhttpヘッダの設定をしたほうが良いのですが、 基本的にはサーバー機能に依存せずに提供できるのがJSONPです > レスポンスがjsonでなくても使える レスポンスはjsonではなく引数付きのコールバック関数になります
nikkori

2019/10/04 01:11

ありがとうございます。そうなんですね。 コールバック関数も使ったことがないのでハードル高そうですが、JSONPについて改めて調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問