tag:crieit.net,2005:https://crieit.net/tags/Web%E3%82%A2%E3%83%97%E3%83%AA/feed 「Webアプリ」の記事 - Crieit Crieitでタグ「Webアプリ」に投稿された最近の記事 2021-05-27T22:53:38+09:00 https://crieit.net/tags/Web%E3%82%A2%E3%83%97%E3%83%AA/feed tag:crieit.net,2005:PublicArticle/17301 2021-05-27T22:50:56+09:00 2021-05-27T22:53:38+09:00 https://crieit.net/posts/Web-60afa3c0c702c Webアプリケーションに関する勉強記録① <p>最近Webアプリケーション作成に興味を持ちましたが、知識が足りないと痛感しました…</p> <p>そのため、この<br /> <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python">伸び悩んでいる3年目Webエンジニアのための、Python Webアプリケーション自作入門</a><br /> を読み、Webアプリケーションとはどういうものなのかを理解していけたらと思います。<br /> 私は3年目でもなければWebエンジニアでもないのですが、とてもわかりやすく楽しい内容だと思うので、興味のある方はこの本を読んでみてください。</p> <p>本記事は、Chapter1~Chapter8の内容について、自分用のまとめとして作成しています。</p> <h2><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/what-is-web-application">Webアプリケーションとはなにか</a></h2> <h3 id="Webアプリケーションについて"><a href="#Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Webアプリケーションについて</a></h3> <p><code>Webアプリケーションとは、Webサービスを提供するプログラムである</code></p> <p>乱暴にかみ砕くとこのように言えます。Webサービスというのはブラウザを介して利用するサービスのことで、GmailやGithubなど普段私たちがブラウザ上で利用しているもののことです。このWebサービスは、プログラミンした文字列ではなく、それらを解釈して実行した結果実現される機能群です。なので、このWebアプリケーションのソースコードを書き、あるプログラムで実行することで、Webサービスが私たちに提供されています。</p> <p>以下の画像がWebアプリケーションの概要図になります。ブラウザがWebサーバーへ何かリクエストを送信すると、Webサーバーは、Webフレームワークを介してサービスごとに固有のプログラムをブラウザに返してくれます。この<em>Webサーバー+Webフレームワーク+サービスごとに固有のライブラリ</em>をまとめてWebアプリケーションと呼ぶことができます。</p> <h3 id="Webサーバとはなにか"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A8%E3%81%AF%E3%81%AA%E3%81%AB%E3%81%8B">Webサーバとはなにか</a></h3> <p>Webサーバーとは、Webサービスを提供する<strong>プログラム</strong>と考えていいです。ここで、Webアプリケーションもそうだったじゃないかと思いますよね。実は広義の意味ではこの二つは同じ意味なのですが、多くの場合、WebサーバーはWebアプリケーションの中でも特にWebサービスを提供する窓口部分のプログラムのことだけを指します。</p> <p>Webサービスはかつては単一のプログラムで提供されており、それをWebサーバーと呼んでいました。しかし、提供するサービスがとても多くなり、よりリッチなサービスとなったため、どんなWebサービスでも使用する共通部分は共通プログラムとして、サービスごとのプログラムと分けて作成するようになりました。その結果、この共通プログラム部分がWebサーバーと呼ばれるものになってきました。</p> <p>Webサーバーの代表例として、apacheやnginxがあります。</p> <h3 id="Webフレームワークについて"><a href="#Web%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Webフレームワークについて</a></h3> <p>先ほどのサービスごとのプログラムの中にも、定番の共通機能がよく見られ、それらがライブラリとして世の中に出回っていきました。それが<em>Webフレームワーク</em>と呼ばれるものです。<br /> Webサーバー上で追加で動かすような構成になっており、PythonのDjangoや、Laravelなどがあります。</p> <h3 id="Webサーバ以外のサーバ"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%90%E4%BB%A5%E5%A4%96%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90">Webサーバ以外のサーバ</a></h3> <p>Webサーバは別名HTTPサーバと呼ばれ、クライアントとHTTPというプロトコルで通信します。他にも様々なサーバが存在し、それぞれプロトコルの違いにより区別されています。</p> <ul> <li>DBサーバ:RDBMSなど、データを格納し走査するためのサーバ</li> <li>ファイルサーバ:主に企業等で用いられる、メンバーがLANの中で自由にファイルを保存し、共有できる仕組みに使用されるサーバコンピュータ</li> <li>メールサーバ:メールの送信・受信の役割を持つサーバ</li> </ul> <h3 id="通信プロトコルについて"><a href="#%E9%80%9A%E4%BF%A1%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">通信プロトコルについて</a></h3> <p>通信プロトコルとは、通信する際の規格のことです。この取り決めを守ることで、メーカー、機種などに左右されずに、全てのパソコンやサーバ間で通信を行うことができます。データの通信ではパケット交換方式が用いられています。これは、通信データをパケットと言われる単位に分割し送ることで、多くのユーザが同時にデータを送受信することを可能にしています。パケットは、ヘッダという通信先や通信元の情報と分割されたデータによって構成されています。</p> <ul> <li>HTTP:ブラウザとWebサーバが通信する際に使われるプロトコル</li> <li>SMTP/POP/IMAP:メールの送受信委関するプロトコル。SMTPはメールの送信、POPはメールサーバから電子メールを受信する際に、IMAPはメールをサーバ上で保持し続ける際に使用するプロトコル。</li> <li>FTP:クライアントとサーバ間のファイル転送の際に使用されるプロトコル</li> </ul> <h2><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/making-silly-web-server">簡易Webサーバーを作る手順</a></h2> <p>実際にWebサーバとブラウザが通信しているところを確認し、真似することで簡易的なWebサーバを作ります。</p> <h3><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/making-silly-web-server-step1">STEP1:ChromeとApacheで通信してみる</a></h3> <h4 id="ブラウザとWebサーバーが「通信する」とは"><a href="#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A8Web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8C%E3%80%8C%E9%80%9A%E4%BF%A1%E3%81%99%E3%82%8B%E3%80%8D%E3%81%A8%E3%81%AF">ブラウザとWebサーバーが「通信する」とは</a></h4> <p>ChromeとApacheの通信、つまり、ブラウザとWebサーバの通信というのは、ブラウザからWebサーバに向かってリクエスト(Webサービスを提供してほしい)を送り、Webサーバがそれに対してレスポンス(Webサービス)を返すということです。</p> <h4 id="ブラウザからWebサーバーへリクエストを送るためには"><a href="#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8B%E3%82%89Web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%B8%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E9%80%81%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%81%AF">ブラウザからWebサーバーへリクエストを送るためには</a></h4> <p>インターネット上で、あるプログラムが別のプログラムへ何かを送るとき、必要となるのは<strong>宛先</strong>と<strong>内容</strong>です。<br /> このうち、Chromeでは、<strong>宛先</strong>だけをURLバーに入力すれば、<strong>内容</strong>は自動で生成されます。</p> <p>ここで、Webサービスにおける<strong>宛先</strong>のことを、<strong>URL</strong>と呼び、以下のような形式で表現されます。</p> <p><span style="font-size: 150%;"> URL = ** <code><protocol></code> : // <code><host></code> : <code><port></code> / <code><path></code> ?** <code><query></code> </span></p> <h4 id="protocol"><a href="#protocol">protocol</a></h4> <p>リクエストの送り方を指定する。Webサービスでは<code>http</code>や<code>https</code>がよく用いられる。郵便に例えると、「普通郵便」や「本人限定受取」といった郵便の送り方のようなものです。このように、宛先や内容には関係ないですが、送る手順や受け取り方がprotocolごとに変わります。</p> <p><code>http</code>ではいわば普通郵便で、送りたい内容をそのまま送ります。<br /> <code>https</code>は暗号化通信で、<code>http</code>よりセキュアな通信が可能となります。</p> <h4 id="host"><a href="#host">host</a></h4> <p>送り先のWebサーバープログラムが動いているマシン(=コンピュータ)のインターネット上の住所を示します。基本的には、インターネット上のマシンを特定するために<code>IPアドレス</code>を使用する。</p> <p>IPアドレス以外に<code>host</code>に使用できるものとして以下のものがあります。</p> <ul> <li><p>DNSに登録されたドメイン:<code>zenn.dev</code> <code>google.com</code>など</p></li> <li><p>localhost:IPアドレス<code>127.0.0.1</code>とみなされ、自分のPCを指す。</p></li> </ul> <p>ただ、自分のPC上には様々なプログラムが動いており、<code>host</code>だけでは宛先として不十分となります。例えば、マンションで、住所だけがわかっても部屋の番号がわからないような状態といえます。そこで、必要になるのが<code>port</code>です。</p> <h4 id="port"><a href="#port">port</a></h4> <p><code>port</code>は、インターネット通信の際に特定のマシンの中で動いている複数のプログラムから、目的のプログラムを特定するための番号。通常、PCやサーバー上では複数のプログラムが動いているため、ポート番号を指定することで、同一IPのプログラムの中から、任意のプログラムへリクエストを送ることができる。</p> <p>port番号は、プログラム起動時にプログラムが0~65535番の中から自分で設定することができる。</p> <ul> <li>Well-Known ports : 複数のプログラムが同じportを番号を使うことはできず、後からそのport番号を割り振ろうとしたほうがエラーとなってしまいます。そのため、どのマシンでもよく使うようなプログラムには予めport番号が予約されており、このport番号のことを<code>well-known ports</code>という。0~1023番まではすでに決まっている。例えば、<code>HTTP</code>は80番、<code>HTTPS</code>は443番、<code>FTP</code>は20・21番など。ただし、必ずしもwell-known portsでサービスを動作させる必要はなく、ソフトウェアによって設定できるようになっていることが多いです。</li> </ul> <p>多くのブラウザでは、http通信する際は、デフォルトで80番ポートへ向けて通信すると決まっているため、httpでポートが80番の場合に限り、port番号を省略し、<code>http://localhost/~</code>と書いてもいいです。</p> <h4 id="path"><a href="#path">path</a></h4> <p>上記の、<code>protocol</code>,<code>host</code>,<code>port</code>がそろえば、ブラウザは相手のWebサーバプログラムの場所を特定して、通信を始めることができます。しかし、一般的に1つのWebサービスに対する要求は1種類ではありません。そのため、どのようなサービスを要求したいかを伝える目的で、pathにその情報を追加します。</p> <p>pathは、<code>/</code>区切りで、サーバ内部のアクセスする対象のファイルの場所を指定する。初期のウェブでは、ウェブサーバー上の物理的なファイルの場所を指定していたが、現在は物理的なものではなく、ウェブサーバーによって処理される、抽象的なものを指定することが多いです。</p> <h4 id="query"><a href="#query">query</a></h4> <p><code>query</code>は、pathに加えて、何か情報を追加で送りたいときに使います。送る情報は、名前と値を<code>=</code>で区切り、パラメータ同士を<code>&</code>で区切ります。ウェブサーバーに与える引数のようなものです。</p> <h3><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/making-silly-web-server-step2">STEP2:ブラウザと自作サーバーで通信してみる</a></h3> <h4 id="TCPサーバー"><a href="#TCP%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC">TCPサーバー</a></h4> <p>TCPサーバーとは、TCP(Transmission Control Protocol)で通信を行うサーバーのことです。TCPは、IPの上位プロトコルで、トランスポート層で動作します。ネットワーク層のIPとセッション層以上のプロトコル(HTTP,FTP,telnet)の橋渡しをする形で動作しています。トランスポート層では、UDPというプロトコルも存在しています。</p> <ul> <li>UDP : コネクションレス型通信(通信開始前に相手との間で事前のやり取りをしない)。通信の信頼性(データの漏れや、順序が守られているかどうか)は高くないが、高速でリアルタイムの通信を行えます。</li> <li>TCP : コネクション型通信(3 wayハンドシェイク)。通信の信頼性が高いです</li> </ul> <p>TCPのコネクションは、<code>3wayハンドシェイク</code>と呼ばれる方法で結ぶ、通信相手との仮想の通信路のことをいいます。</p> <h3><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/making-silly-web-server-step2">STEP3:自作クライアントとApacheで通信してみる</a></h3> <h3><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/making-silly-web-server-step2">STEP4:自作サーバーを進化させる</a></h3> k-s-p