N予備校_学習ログ
N予備校を学習するにあたって、軽いインプットも含め学んだことをメモっていく。
内容は、第4章 実践サーバーサイドプログラミング より
03_ExpressのAPI
Expressにおけるセキュリティのベストプラクティス
- 脆弱性のあるバージョンは使わない
- HTTPS で TLS という暗号化通信を使う
- helmet(ヘルメット)というモジュールを利用する
- Cookie を安全に使う(デフォルトのキー名などを使わない等)
- 依存ライブラリの安全性を確かめる
- 既知の脆弱性に気をつける
helmet
では、X-Powered-By:
で表示される内容を隠蔽することができる。
▶︎ 実行は app.use(helmet());
APIの作成
- ルーティングの基本
app.get('/', function (req, res) {
res.send('Hello World!');
});
▶︎ 読み込んだexpressのモジュールから新たにオブジェクトを作成(appとする)。
getメソッドで繋げられるので、第1引数にアドレス、第二引数にコールバック関数を入れる。
コールバック第一引数には、request
、response
が入る。
res.send
で任意の文字列やHTML、jsonなどいろんな文字列を返すことができる。
※res.render
ではテンプレートファイルを用いてレスポンスデータを返すことができる。
▶︎ あらかじめテンプレートファイルを用いるのがわかっているなら、res.render
の方が良い?
04_GitHub を使った外部認証
OAuth2.0とは
▶︎ アプリケーション利用者が第三者のアプリケーションに顕現を委ね、アプリケーションの機能や認証を第三者アプリケーションを用いて可能にする仕組み。
Githubを用いたOAuth2.0 での認証
- Github上に開発するアプリケーションを登録
- 登録時に作ったトークンをアプリケーションに登録
- ログイン時にアプリケーションがGithubを経由して、ユーザーがログインしていいかどうかの認可を要求する
- 許可するとアプリケーションがGihubからユーザー情報を引っ張ってくる
- 4で受け取った情報を使って利用者を認証する
▶︎ 仕組みとして、HTTP の Authorization ヘッダ を利用。
github認証をする上で必要となるライブラリ
- passport:外部認証を組み込むためのモジュール
- passport-github2:passport で GitHub の OAuth2.0 認証を利用できるようにするモジュール
▶︎ strategy(戦略)モジュールと呼ぶ - express-session :Expressでセッションを利用できるようにするためのモジュール
processs.nextTick() について
passportオブジェクトを扱う際にprocess.nextTick()
なる記述が登場。
登録したコールバック関数を実行したいタイミングでできるようにするために、
process.nextTick()
を使う必要がある。
イベントループの話がさらっと出てきたので、ここはまた追って理解を深めたい。
(というか難しすぎる
09_AJAX
AJAX(Asynchronous JavaScript + XML)とは:
▶︎ ブラウザ上のJavascriptからサーバへの非同期のHTTPリクエストを行い、その結果を使ってUIを更新する方法。通信にはJSONフォーマットを利用することが多い。
ロードアベレージとは:
▶︎ 1 CPU における単位時間あたりの 実行待ちとディスク I/O 待ちのプロセスやタスクの平均値。
値が高ければ高いほど、性能に対して負荷が高い状態といえる。
ポーリング:
▶︎ クライアントからサーバーに対して一定間隔で行う通信のこと
一つのサーバに対して、複数のクライアントが多いと高い負荷がサーバーにかかってしまう。
同一生成元ポリシー:
▶︎ 読み込むコンテンツが同一の生成元(オリジン)から提供されているかを確認し、外部からの干渉を防ごうとするブラウザ上のセキュリティ原則。
オリジンとは、
・スキーム(http)
・ホスト(host)
・ポート(3000)
の3つをまとめたものを指す。
AJAXでは、同一生成元ポリシーが適用されているため、オリジンが異なるリソースにアクセスすることができない。ちなみにオリジンが異なるリソースへのアクセスをクロスオリジンリクエストと呼ぶ。
▶︎ CSRF脆弱性を防ぐ仕組みとして有用。
10_WebSocket
WebSocket とは:
▶︎ サーバ・クライアント間で双方向通信を行うための通信規格。
HTTP通信では、クライアントからサーバに要求して応答を得るという一方的な手法でしか実現できなかったが、WebSocketを利用することで、双方向での通信を可能とする。
メリットとしては、
- 従来の通信規格よりもリアルタイムに情報を共有することが可能となる
- リアルタイムなサーバクライアント間通信を、負荷をかけずおこなうことができるようになる。
などが挙げられる。
サーバー上で利用するには、socket.io
クライアントで利用するには、socket.io-client
上記のパッケージが必要。
■ 備考
とはいえWebSocketでも情報を取得する際の遅延は起きるもの
代替案として、ポーリングを使って通信をするという選択もなくはないそう
ただサーバー負荷を確認する必要がありそうな
WebSocektも完璧ではないみたい
いろいろな通信方式
- プル通信
- クライアントでサーバー上からデータを取得する際には最長でポーリングの間隔分の遅延が追加で発生する。
- プッシュ通信
- プル通信で発生していたポーリングによる遅延がなくなるので、最長でも通信時間とサーバーの処理にかかった時間のずれだけで通信ができる。
11_【データベース1】RDBMS と SQL
RDB とSQL
-
RDB は、行と列からなる「表」の形でデータを管理するデータベースのことを指す。
- RDBを管理するソフトのことをRDBMSと呼ぶ。
-
SQL は RDBMS を扱うための言語
PostgreSQLの基本
データベースの作成
- 作成
CREATE DATABASE hoge;
- 接続
\c hoge
- 終了
\q
▶︎ SQLで使われる構文は慣例によって、全て大文字で表記する。
テーブルの作成
CREATE TABLE huga (write_date DATE PRIMARY KEY, body TEXT);
▶︎ write_dateという名前の列をDATE型で定義。PRIMARY KEY(主キー)で定義
- テーブルの確認
\dt
データの追加(INSER INTO)
INSERT INTO huga (write_date, body) VALUES ('2022-05-22', '最初のレコードです');
データの取得(SELECT)
SELECT body FROM hoge;
▶︎ body
列を取得
テーブル内のデータを取得する場合は下記の指定。
SELECT * FROM hoge;
データの削除(DELETE FROM)
DELETE FROM pages WHERE write_date='2022-05-22';
ちなみに、DROP TABLE テーブル名;
とするとテーブルごと削除されるので、扱いに注意。
文字列による検索(WHERE句)
SELECT * FROM hoge WHERE body LIKE '%最初のレコードです%';
▶︎ body列、「最初のレコードです」という文字列が入ったレコードを全て取得する。
12_データモデリング
データモデリングとは:
▶︎ データベースの設計のこと
■流れ
- データベース管理したい対象(エンティティ)を決める
- それらの関わりを考える
- データとして持つ項目をまとめる
▶︎ データ中心アプローチと呼ぶ
DBを使って管理したいもの(まとまりのあるもの)をエンティティという。
エンティティ同士の関わりのことをリレーションシップ(Relationship)と呼ぶ
リレーションシップを持つ両者の数の対応をカーディナリティと呼ぶ。
例:多くの生徒がひとつのクラスに属している関係(1対多)
他のエンティティに依存していて、
それがなくなると存在しないエンティティを従属エンティティと呼ぶ。
エンティティに含まれるデータ項目のことを属性と呼ぶ。
▶︎ ER図にまとめるとわかりやすい。
一つのテーブルの中に同じような値が複数回登場していたり、データの実体が散らばっているような表(テーブル)のことを、非正規形と呼ぶ。
別のテーブルの主キーを格納する列のことを外部キーと呼ぶ。
レコードの値が重複することなく、どこかのテーブルで一つしか存在しないようにテーブルを整理すること正規化と呼ぶ。
・テーブルに列を追加する構文
ALETR TABLE テーブル名 ADD 追加する列の名前 データ型;
・列の名前を変更する構文
ALTER TABLE テーブル名 RENAME COLUMN 列名 TO 新しい列名
13_【データベース3】テーブルの結合
内部結合:JOIN ≒ INNER JOIN
▶︎ テーブル同士でお互いに存在する内容の行のみ結合したものを出力する。
■外部結合
- 左外部結合 (LEFT JOIN):左側で指定したテーブルの行を全て含めて結合出力する
- 右外部結合 (RIGHT JOIN):右側で指定したテーブルの行を全て含めて結合出力する
- 完全外部結合 (FULL JOIN):双方で指定したテーブルの行を全て含めた状態で結合出力する
■構文
テーブル同士の内部結合
SELECT body, name FROM diaries JOIN users ON diaries.userid = users.userid;
▶︎ diariesテーブルとusersテーブルのuserid が合致する行の
body
と name
を出力する。
続き