2015年6月18日木曜日

SSL通信について調べてみた

こんにちは、田中です。
セキュアな通信がしたかったのでSSLの仕組みについて調べてみました。
以下参考にしたサイトです。
図解で学ぶネットワークの基礎:SSL編


SSLとは

暗号通信のこと。Secure Sockets Layerの略。
SSLでしたいことは大きく二つ。
1.クライアントとサーバー間でやり取りするデータを暗号化したい
2.やりとりする先のサーバーが偽のサーバーでないかどうか判別したい
実際は1のみで良い気がしますが、通信の途中でデータをどこかで盗み見られたり改ざんされたりするリスクを少しでも減らすために2も行うことでより安全性を確保するようです。

1を行う仕組み

クライアントとサーバー間でのやり取りを暗号化する方法として共通鍵というものを使います。
共通鍵はクライアントとサーバー双方で同じものを持っており、この鍵を使うことによって暗号化されたデータを解読することが可能になります。

2を行う仕組み

やりとりする先のサーバーが偽のサーバーでないかどうかを判別する方法として、秘密鍵、公開鍵、サーバー証明書、ルート証明書というものを使います。
秘密鍵はサーバーが、公開鍵はクライアントが持ちます。この秘密鍵と公開鍵は対になっていて、それぞれが対になる鍵で暗号化されたデータを解読することができるようになっています。
しかし、これらの鍵は通常のSSLでデータをやりとりするための鍵ではなく、通常のデータのやりとりは共通鍵で行います。
じゃあ秘密鍵と公開鍵はどこで使うの?となりますが、これらの鍵はデータをやりとりするための共通鍵を交換するために使います。

共通鍵はサーバーからクライアントにサーバー証明書というものと一緒に送られます。
このサーバー証明書には著名や出どころなどの情報が記載されており、サーバーが信頼のおけるものであることを証明します。
しかしこのサーバー証明書もまだ偽装の余地があるため、サーバー証明書と一緒にルート証明書というものも送られます。
ルート証明書はサーバー管理者が認証局というところに申請して発行してもらった確実に身分を証明できる証明書のことで、サーバー証明書に著名した認証局の根本の証明書となります。
しかしクライアントからすればそのルート証明書も信頼出来るものか怪しいところがあります。
それを確認するために、クライアント側にはすでにあらかじめ信頼出来る認証局の証明書が複数インストールされています。
クライアントは送られてきたルート証明書と自身の持つ信頼のおける証明書を比較して、それらが一致した場合に初めて送られた共通鍵が信頼のおけるものだと判断します。

まとめ

どこかまだ認識が間違っているかもしれませんが、1と2のちょっと複雑な処理を行うことによってデータをセキュアにやりとりしてるんですね。
これは難しいわぁ...。
でもなんとなく流れはわかった気がするので、まとめて勉強する時間を持つのは大切ですね。

2015年6月17日水曜日

HTTP通信、セッションID、Cookieとキャッシュの違いなど調べてみた

こんにちは、田中です。
普段開発をしていてiOS側からだと単純に「GET, POSTなんかの概念があって、それを指定してやってパラメーターとか付け足して送ってやれば良い感じにAPIからデータがとれる」くらいの認識で、自分のネットワーク周りの知識はこのくらいでした。
が、最近知人と話をしていて「HTTPヘッダー部がほげほげで」やら「セッションIDがふがふがで」とか「Cookieにぴよぴよ」という話が出てきて理解の必要性を感じたので調べてみました。


HTTPヘッダーとは


以下のサイトを参考にさせていただきました。
[Web] HTTPリクエストの中身を学んでみた。GETやPOSTの違いなど
http(通信プロトコル)とは?httpの仕組みと、通信内容(リクエストヘッダとレスポンスヘッダ)の確認手順まとめ

こういうのがあるという存在は知っていましたが何者かは知りませんでした。
そもそもHTTPというのはクライアントからWebサーバーへの「リクエスト」と、Webサーバーからクライアントへの「レスポンス」という二つのやりとりで成り立つ通信プロトコルのこと。
HTTPリクエストはHTTPリクエスト行HTTPヘッダ行HTTPボディ部の三つで構成されています。
GET通信ではHTTPリクエスト行とHTTPヘッダ行で、POST通信では上記三つでリクエストが行われます。
上記三つがどのような構造で送受信が行われているかについては、参考URLにわかりやすい画像が貼ってあるので、そちらを参照のこと。


セッションIDとは


以下のサイトを参考にさせていただきました。
第8回:Cookieとセッション情報

そもそもセッションとは

Cookieがクライアントベースの仕組みなのに対してサーバーベースの仕組みで、クライアントに情報を保持するCookieに対してセッションはすべての情報をサーバー側で管理して、それらの情報は数分〜数時間程度しか保持されないのでセキュリティ的なメリットが大きい。なので、アプリケーションの挙動を左右する重要な情報を扱う場合はこのセッションを使う。

セッションIDというのはクライアントがサーバーにアクセスする際にサーバーから渡されるユーザを識別するためのキー情報のこと。クライアントがサーバーにアクセスするときはこのセッションIDをHTTPヘッダー部に組み込んで情報を送信するようです。

Cookieとは

セッションがサーバーベースの仕組みなのに対して、Cookieはクライアントベースの仕組みで、サーバーサイドからクライアントに対して書き込める小さなテキストのこと。クライアントはこのCookieを永続的に保持できて、この保持するデータは書き込み元のサーバーにリクエストする際にHTTPヘッダー部に組み込んで情報を送信するそうです。
このCookieはクライアントサイドで保持するデータなので改ざんされる可能性があります。そのためアプリケーションの挙動を左右する重要な情報を扱う場合はCookieでは扱いません。Cookieで主に扱うのは個人のユーザーIDやパスワードなど。(次回ログイン時のためにデータを保持しておく際など)


Cookieとキャッシュの違いって?


以下のサイトを参考にさせていただきました。
「キャッシュ」と「クッキー」の違い
情報をクライアント側で保持するというのであればキャッシュという仕組みもあるなぁと思ったので、じゃあCookieとの違いはなんなのか?とふと思ったのでこれについても調べてみました。

キャッシュとは

2回目以降にウェブページなどにアクセスする際にロードの時間を早くするために、画像などのデータをクライアント側に保持しておく仕組みのこと。


Cookieとは

2回目以降にログイン処理などを素早く行うためにID/パスワードなどのユーザー情報をクライアント側に保持しておく仕組みのこと。
(「次回からユーザー情報の入力を省略」などチェックボックスがあるようなやつ)


まとめ

HTTPの三つの構成、セッションとCookieの役割と仕組み、キャッシュとCookieの違いについて、ざっくりと認識できました。まだ脳みそへの定着が済んでないのでこの部分の話をするときに噛み砕く処理が必要になるけれど。
若干まだわからないのがセッションが具体的にどういう場合に利用されるのかというところ。ここに関してはまた調べたりしていきます。
あとiOSで扱うときにHTTPヘッダー部を見たり編集するにはどうするか、その中のセッションIDの取得とかをどうやるのかとかも今後使いそうなので調べていこうと思います。
とりあえず今回はここまで。