未経験からウェブカツ!!"SESSION"と"Cookie"プログラミング学習レポ
スポンサーリンク

ウェブカツ!!女性割引を適応し、プログラミング学習をしています。
ウェブカツ!!オンラインプログラミングスクールを受講し始め、3ヶ月半経ちました。前回からの学習報告をしたいと思います。

日々のプログラミング学習過程をtwitterで報告しています。学習ペースは早くないけど日々頑張っているので、いいね・フォローしてもらえると嬉しいです。

初回の記事やプロフィールにも書きましたが、プログラミングは全くの未経験者です。
ある程度早急に、そして確実に仕事にできる、かつ、フリーランスとして働ける技術を身につけたく探していたところプログラミングに辿り着きました。

前回の進捗報告はこちら

自作サービス開発開始!!

*ここでは、超初心者がプログラミング学習においてのアウトプットの方法に悩んだ時に考えたこと、開発途中で調べたことなどを整理しています。

なので、説明不足だったり、理解不足、間違った理解をしているところが多々(!?)あると思います。
「coconはそうやって作っているのね〜」
「ショボッ」
くらいに流してくださいませ。
間違いの指摘はお待ちしています!

早速ですが、前回からの進捗状況です。

webサービス部の進め方

webサービス部をLession20まで、動画視聴、写経、質問内容の理解、を一連の流れとして進めてきました。
しかし、Lesson20に入ったあたりから「作りたいもの」が浮かんで来るようになりました。

一通り流れを考えてみて、最終的に、私のしたいこと、調べてみると私の今のプログラミングの理解ではちょっと無理めなところがあるのですが。。

気にせず(!?)進めてみます。

アウトプットするにあたり、

今の私の理解では全く白紙からの作成は絶対無理。

半オリジナルとかも厳しくないか?

オリジナルから作るメリット

  • 自分で作ることでググり力、エラー対応の力が付く(答えが準備されていない)
  • アウトプットすることで、苦手、理解の不十分なところがあぶり出される。

オリジナルから作るデメリット

  • エラーになった時の対処に時間がかかる(最悪の場合、解決できないことにもなりかねない)
  • 顧問の言う「その学習内容に合ったアウトプット」の範囲を超える場合がある。

何度も通らないとwebサービス部の内容を理解できないだろう。

1回目はさらっとよりは深めに通ったのだから、2周目学習として、
中身はほぼLesson通りの「ほぼコピアウトプット」を進めてみることにしました。

内容ほぼ一緒で、サービスだけ変えてみよう。
全くプログラミング未経験で一から作るのは負担が大きすぎて多分めっちゃ時間かかる。
小さなことから慣らしてみよう。

書いてみると内容ほぼ一緒なんて簡単そうですが、それでも上手くいくか不安です。。

いや、できる所までやって、「完成できなくてもやることに意味がある!」と信じてやってみようと思います。
「プログラミングはアウトプットして初めて力になる!!」

1周目の残りのLessonは視聴、質問内容の理解のみ、同時に進めています。

貴重な先輩ブログとありがたい後押し

そんなことで開始した所、なんというタイミング!!
先日、ウェブカツ!!卒業試験に合格し卒業されたRIEさん(RIE🇲🇾KLゆるゆる生活)から、受講生に送ってくれたウェブカツ攻略(!!)集。

その中に、なんとRIEさんもwebサービス部アウトプットは同じような状況から始めた模様…!
いやいや、理解度レベルが全然及ばないのですが。。
とても励みになりました!!!

「もう見切り発車で何か作ろう!
詰まったらその時調べりゃいけるいける(*´ω`*)」

・・と、今から思うと理解度5割くらいよねあなた!?な状態で
フルスクラッチで何か作り始めようと無謀な決意をしたのでした。

何度も言います。
RIEさんとは今までのプログラミング経験も違いすぎ、この時点までの進み方もかなりかけ離れています。
浅はかな思いで「同じだ!」と思ってはいけませんが、「とりあえずやってみよう」でも行けるかもしれない。

お祝いのお言葉を言いたかったのと、自分の想いを伝えたく、勢い余ってついツイートしてしまいました。

そして、ありがたいお返事もくださいました!↓

そして、

webサービス部はL16までで詰まったら
まずPHP部に戻って(何ならprogateの力も借りて)
力を蓄えてからリトライが最善

のお言葉を胸に、
「どーせ時間かけるなら黙々と写経を続けるより、進まずとも自分で考えることに費やす方がいいのではないか」

頑張ります。

スポンサーリンク

学習状況

学習進捗報告
ウェブカツ!!学習:107日経過
学習時間:185.5h
学習内容:webサービス部lesson23、2周目lesson14まで

アウトプット作成の流れ

  1. 画面設計
  2. テーブル設計
  3. DB作成
  4. 画面作成
  5. ユーザー登録機能実装
  6. ログイン機能実装
  7. ログアウト機能実装
  8. 退会機能実装

と、Lesson内容に従ってやってまいりました。
webサービス部前半は大幅に変わるところがないのでサクサク進みました。

テーブル設計とDB作成はきちんとやっておかないと後々変更したり、面倒なことになりそうです。

学習で使用したテーブルと見比べながら、自分のサービスに必要なものをあげてみましたが、抜けているものありそう。
とりあえず進めますが、そこにちゃんと気付けるのだろうか。。

皆さんの学習を参考にさせていただく

テーブル設計とDB作成は、あんまんさん(あんまん@プログラミング勉強中)の記事を参考に進めさせていただきました。


私なんか、作成途中をお見せする勇気もないけど。。

他の方も所々、作業内容をツイートしてくれていたり。
みなさん普通にこのくらいされているのかな?

あんまんさんはしっかり構成されています。
それを公表してくれているので、初めて作るのにかなり重宝しました。

そして定期ブログ以外にも常に経過報告をされていて素晴らしい、見習わなければ…!!

今回のプログラミング学習での整理

sessionと cookie

2周目も見事にハマりました。
と言うか、1周目でさらっと通り過ぎていました。

この辺が重要です。
写経とほぼコピでも自分のスタイルに替えてみることで、写経の時はすんなり通るところも自分の考えたものになると躓きます。

これについてはウェブカツ!!学習の中でも丁寧に説明してくれています。
ですが、なかなかピンとこなかったので、整理して簡単にまとめます。

全然「噛み砕いている」「説明が超わかりやすい」とかではないのですが。

参考記事

session

session:

一連の処理の始まりから終わりまでを表す
ログイン

複数のページを往き来する

ログアウトするか離脱するまでの処理

まず前提に、HTTPはステートレスであるため、一連の処理として扱えない。

HTTP:

Hypertext Transfer Protocol (ハイパーテキスト・トランスファー・プロトコル)

HTTPはHTMLファイルなどを渡すためのリクエストとレスポンスするときの決まり事

  • クライアントからサーバーへリクエストした内容:リクエストメッセージ
  • サーバーからクライアントへレスポンスした内容:レスポンスメッセージ

HTTPメッセージ:この2つの総称。

HTTPは、このHTTPメッセージ1往復で通信が切断される。

サーバーは、前のページからの続きなのか、関連したアクセスなのか、以前の状態を全く覚えていない状態。

ステートレス(stateless)

Cookie

Cookie
クライアントに保存された情報のこと
Cookieに一意の値を入れ、リクエストするときにCookieにある値も一緒に送ってもらうことで、識別可能になり、一連の処理として扱えるようになる。

クライアントにCookieが存在する限り、常にリクエストメッセージに Cookie ヘッダを付与する。

また、Cookieを利用することで、セッション管理が行えるようになる。

Cookieを使わずにセッション管理する方法では、Cookieを使う方法と比べて情報が漏洩する可能性が高い

結論:Cookieを使ってセッション管理する。

PHPでセッションを管理する

1セッション開始:session_start() 関数

セッションID:Cookieに入れる「一意の値」の役割をする

session_start()の挙動
・セッションIDがある場合:
 該当するセッションファイルにある情報を参照
・セッションIDがない場合:
 セッションIDを発行し、セッションIDをCookieに保存するようにレスポンスメッセージを送信
 同時に、サーバー側では、セッションIDごとにセッションファイルを作成
  • セッション管理するページでは、session_start()を必ず記述する
  • HTMLタグより先に記述する。
  • セッションIDは、個人を識別するために使われる重要な値
  • PHPの場合は、自動的に複雑な値を作成してくれる。

2PHPでセッションの情報を保存・取得する方法

情報を保存する方法:
セッション情報は、スーパーグローバル変数の $_SESSION に連想配列として格納される。

$_SESSION['名前'] = 値

保存した情報を取得する方法:
スーパーグローバル変数の $_SESSION に格納されている name という名前の値を $name という変数に代入

$name = $_SESSION['name'];
3PHPでセッションファイルの有効期限を変更する方法

session.gc_maxlifetime を変更
php.iniまたはini_set関数で変更可能

session.gc_maxlifetimeの初期値の確認:phpinfo()を実行
PHP5.5の場合:session.gc_maxlifetimeの値は1440(24分間)

最終アクセスから数えて24分後
session.gc_divisorの値を分母とし、session.gc_probabilityの値を分子とした確率で削除

有効期限が過ぎたセッションファイルは、削除可能な状態で待機し、100回に1回の確率でまとめて削除される
(session.gc_divisorの値は100、session.gc_probabilityの値は1の場合)

ini_set関数を使って有効期限を変更
session_start() より前に記述する

// どのバージョンでも使える書き方

ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 7);

// PHP7.0以降で使える書き方

session_start(['gc_maxlifetime' => 60 * 60 * 24 * 7]);
4セッション固定攻撃への対策

session_regenerate_id 関数
現在のセッションIDを新しく生成したものと置き換える(なりすましのセキュリティ対策)

  • セッションファイルを新しい名前にしてコピーする
  • 古いセッションファイルを削除する
  • ユーザーに新たに Set-Cookieヘッダー を送信する

関数を全てのページに使っていると,サーバーに対しても負荷がかかりエラーの原因にもなり得る。
ログイン直後に限定

5PHPでセッションファイルを破棄する方法

特定のセッション情報を削除する:unset()関数

unset($_SESSION['name']);

1)空の配列 array() を代入する

$_SESSION = ();
  • セッション情報が破棄される。
  • ディスク領域的には問題ないが,空のセッションファイルが残る。
  • 現在のスクリプト実行が終了するまでの間はディスク上に存在しているセッションファイルに書き込まれている情報はリセットされない。
  • ユーザー側の セッション用のCookie には影響を与えない。

2)session_destroy 関数をコールする

session_destroy();
  • サーバー側のディスク上に存在しているセッションファイル自体を強制的に削除する。
  • 現在のスクリプト実行が終了するまでの間はメモリー上に存在している $_SESSION が保持している情報はリセットされない。
  • ユーザー側の セッション用のCookie には影響を与えない。

3)Cookieを削除

setcookie(session_name(), '', 1, '/');

setcookie()関数に

  • 過去の時間を指定
  • 同じパスとドメインを指定

して削除

1)〜3)いずれの場合も単独で使用した場合、session固定攻撃を防げない。

1)2)同じWebブラウザからログインしてきた場合なりすましの危険
3)は共用パソコンでのトラブルは防げるが、session固定攻撃を防げない。

しかし、全てに共通することは、
ログイン直後に session_regenerate_id 関数をコールしている場合には安全。

極論:
session_regenerate_id 関数のコールを行ってしまえば、安全。

1)、2)は両方行い, 3) は行わなくてもよいと言うことになるが、全部行うのが万全で確実。

まとめ

今回はまとめただけの記事になってしまいました。
プログラミングはアウトプットが命。

エラーの解決も整理して文章に表現できれば理解も深まります。
この定期ブログの提出は、その実行にとても良い機会です。

なるだけ、経験したエラー対処法やプログラミング学習で得た知識をまとめようと思っています。
そしてそれは後々自分の成果物になるし、自分だけの辞書になります。

ただ単にエラー解決できたらOK、ブログ書いたらOKではなく、そういう使い方をしたいと思っています。

が。。。今回は。
アウトプットの途中で、エラーも色々出ていたし、対処法など書きたかったのですが。。

まだまだプログラミング初心者。
理解しきれていないことや、第一アウトプットに夢中になっていたため、ブログ作成着手が遅くなってしまったのが一因です。反省…!

次回のブログ更新までに1つサービス作り終える自信はありませんが。。
とりあえず行けるところまで!今日も頑張っていきます!

最近のコメント

    Twitterでフォローしよう

    おすすめの記事