Laravelにおける認可と認証

#はじめに
この記事では実装法は書かず概要程度にとどめておきます。
ご了承ください。
#認可と認証の違い
##認証
 いわゆるログイン。
サイトにアクセスしてきたユーザーが**本人か本人でないか**を確認すること。

###認証の種類
- Basic認証　
 - 実装が容易でほぼすべてのWebサーバー・ブラウザで対応。
 - ログアウト機能がないため認証状態を削除するためにはブラウザを終了する必要がある。
 - **盗聴すれば容易にパスワードがわかってしまう。**(HTTPSを使用すれば解決できる。)
 - webアプリ上のファイルやページにアクセス制限をもう携帯時に使用されることが多い。
- 　Digest認証
 - HTTPで定義される認証方法の一つ。
 - Basic認証の平文でパスワードが送信されてしまうという欠点を改善したもの。
 - ユーザーIDとパスワードをMD5でハッシュ化して送信するため解析が困難になった。
 - ただしサーバーには**平文で保存されているためセキュリティはBasic認証より劣る。**
 - すべてのwebブラウザでは対応していないので不特定多数が利用するページには不向き。
 - HTTPSが使えない環境で使われる。
- Form認証
 - HTMLで作られたフォーム画面からIDとパスワードを送信する認証方式。
 - 平文で送信されるので、**SSL（HTTPS）を使用して暗号化通信**をするのが一般的。 
 - フォームに入力されたIDとパスワードををサーバーに送信し、サーバーはIDとパスワードが正しいかを確認。正しければセッション管理を開始し**セッションIDを返却する。**
 - 返却されたセッションIDが有効な期間のみwebページを閲覧できる。
 - リクエストのたびに認証情報をおくる必要がないため**処理が高速。**
 - **クロスサイトリクエストフォートジェリに弱い。**

 [Basic認証 Digest認証 Form認証の違い](https://medium-company.com/http%E8%AA%8D%E8%A8%BC%E6%96%B9%E6%B3%95%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E9%81%95%E3%81%84/)
[ウェブサイトのさまざまな「認証方式」をまとめて比較した結果がコレ](https://gigazine.net/news/20201227-web-authentication-methods-compared/)

 
####※クロスサイトフォートジェリ（CSRF）
ウェブアプリケーションの脆弱性を悪用するサイバー攻撃の一つ。
ユーザーがターゲットになるwebサイトにログイン状態のときに、攻撃者がユーザーをリンクやメールで用意した罠サイトに誘導。
罠サイトにアクセスするとあらかじめ用意されていた偽のリクエストがターゲットのwebサイトに送信、実行され意図しない投稿をされたり登録情報の変更、強制退会等がされる攻撃。
[クロスサイトリクエストフォージェリ（CSRF）](https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/csrf.html)
[クロスサイトリクエストフォージェリ（CSRF）とは？](https://siteguard.jp-secure.com/blog/what-is-csrf)

####XSSとの違い
攻撃者が誘導したwebページにアクセスすることで利用者のCookieを取得し個人情報などを抜き出す。
動的なwebサイトにある入力フォームの脆弱性を狙ったもの。
[クロスサイトスクリプティング（XSS）とは｜攻撃の仕組みと対策方法を解説](https://www.amiya.co.jp/column/cross_site_scripting_20210118.html)←ここが一番わかりやすかったです！
[「クロスサイトスクリプティング（XSS）」とは？](https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/xss.html)
[3分でわかるXSSとCSRFの違い](https://qiita.com/wanko5296/items/142b5b82485b0196a2da)


##認可
**とある特定の条件に対して、リソースアクセスの権限を与えること。**
例えばログイン中のユーザーが自分の投稿した内容を編集削除することができるが、他のユーザーの投稿は閲覧のみできるなどのようなものがある。
また近年ではサイトをまたいだ投稿が増えてきており、そういった場合サイトを跨いだ認可が必要なため**OAuth**といったサイトを跨いだ認可を実現するために標準化されたプロトコルが開発された。**Oauthは認可のみで認証はしない。**
####OpenID Connect
OAuth2.0をベースに認証機能が追加されたプロトコル。
認証機能と認可機能が実現できるため、OAuthのように別途認証を用意する必要がない。
OpenIDConnectをざっくりとまとめると、OpenIDConnectにはIDトークンが使用される。クライアントアプリケーションからIDトークンの要求があったときOpenIDプロバイダー（IDトークンを発行するところ）はIDトークンの生成のために本人確認をする。（**つまり認証**）
この**IDトークンの発行の要求と応答を標準化したものがOpenIDConnect**である。
OAuth2.0ではこの**IDトークンとアクセストークンの処理フローが共通のため認可と認証が行える**ということになる。
(だいぶ細かいところは端折っているので参考リンクを見てください。とてもわかりやすかったです。)
[一番分かりやすい OpenID Connect の説明](https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe)

#Laravelにおける認証
認証機能は**「ガード」**と**「プロバイダ」**の2つの中心概念で構成されている。
###ガード
URLごとにセッションで認証するのか・トークンで認証を行うか決定する。(**認証方法の決定**)

###プロバイダ
プロバイダは和訳すると提供者。つまりデータ（認証情報）を提供するものとう意味になる。
ガードは認証方法を設定するものに対して**プロバイダはその認証情報をどこから・どのように取得するのかを決定する。**
Laravelでデータを取得するにはEloquentORMとクエリビルダの2種類の手段がある。
このいずれかを使用することを指定するのがプロバイダということになる。

[認証](https://readouble.com/laravel/5.7/ja/authentication.html)
[Laravelの認証の概要](https://it.becrazy.jp/article/laravel-about-authentication)

Laravel6系以降は実際に実装するときはLaravel-uiを用いると簡単に認証機能を実装できます。
（5.X系では`php artisan make:auth`で作成できる。）
[【Laravel】「laravel-ui」について](http://www.code-magagine.com/?p=10606)
[Laravel8 (laravel/ui)でのLogin機能の実装方法メモ](https://qiita.com/daisu_yamazaki/items/b946594896179abcd203)

#Laravelにおける認可
認可には「ゲート」と「ポリシー」があります。どちらもひとつのアプリケーションで一緒に使われます。
また認可は認証済みであることが前提です。
###ゲートとポリシーの違い
どちらも認可を与える機能であるいことは同じだが、ゲートは**特定のアクションを実行する許可がそのユーザーにあるかどうかを決める。**（例:管理者権限を与えるで記事を削除できる等）
ポリシーは**特定のモデルに対して実行できるアクション（編集、削除など）を制限する。**（自分が書いた記事を削除できるが他人の記事は削除できない等）
そのためポリシーはモデルごとに作成する必要がある。
ゲートでもモデルに対するアクションを制限することもできるが大変なので
ポリシー　→　モデルやリソースに対する認可
ゲート　→　　それ以外のもの
のような切り分けになる。

[Laravelで権限を設定できるGate, Policy, Middlewareの違いと設定方法](https://biz.addisteria.com/gate_policy_middleware/#toc14)