0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【転職活動】ポートフォリオ提出 — 認証まわりで想定しておくこと【ポートフォリオ】

0
Posted at

ポートフォリオに関する現段階での面接対策

現在開発中のポートフォリオに関して、面接で聞かれる可能性のある認証周りの内容をまとめてみました。


まず押さえる:このアプリの認証の仕組み

一言で言うと 「ログイン成功 → サーバー側セッションにユーザー情報を保存 → 各画面でセッションを確認」 です。

認証フロー(概要)

実装の要点

項目 このアプリでの実装
パスワード保存 BCrypt ハッシュ(平文は DB に保存しない)
ログイン状態の保持 HttpSessionloginUserEmail, loginUserName
保護 各 Controller で 手動チェック → なければ /login
ログアウト session.invalidate()
Spring Security フル導入はしていないBCryptPasswordEncoder のみ利用)

聞かれやすいテーマ(想定 Q&A)

1. 「認証方式は何? なぜそれ?」

答えの骨子:

  • セッションベース認証(サーバーがログイン状態を覚える)
  • ブラウザは JSESSIONID の Cookie を送る
  • 学習段階では分かりやすく、Spring MVC の流れ(Controller → Session → DB)を自分で書ける

JWT との違い(聞かれたら):

  • セッション: 状態をサーバー側が持つ。ログアウトで即無効化しやすい
  • JWT: トークンをクライアントが持つ。API / SPA 向き。今回の Thymeleaf サーバー描画とは相性が違う

2. 「パスワードはどう守っている?」

答えの骨子:

  • 登録時: BCryptPasswordEncoder.encode() でハッシュ化 → password_hash 列に保存
  • ログイン時: matches(入力, DBのハッシュ) で照合
  • 平文パスワードは保存・ログ出力しない

深掘り:

  • BCrypt は ソルト付き・計算コストが高い ので総当たりに強い
  • DB が漏れても、元のパスワードは復元しにくい

3. 「ログイン失敗時、なぜ『メールかパスワードが違う』とだけ出す?」

答えの骨子:

  • ユーザー不存在 / パスワード不一致を 同じメッセージ にしている
  • 「このメールは登録されていない」と分かると、アカウントの存在が推測される(ユーザー列挙)のを防ぐ意図

正直に言える注意点:

  • 新規登録では「メール重複」エラーが出るので、登録画面経由ではメールの存在が分かる 点はトレードオフ

4. 「未ログインで /top や /profile/edit に直接アクセスしたら?」

答えの骨子:

  • TopController, ProfileEditController などで session.getAttribute("loginUserEmail") を確認
  • null なら redirect:/login
  • スキル編集でも同様(ログアウト後に /skill/edit → ログインへ、は既に確認済み)

自分で確認しておくとよい点:

  • GET と POST の 両方 でガードしているか(POST だけ抜けていると穴になる)
  • プロフィール更新の POST も、セッション未設定時の動きを一度確認しておく

5. 「Spring Security を使っていないのは問題?」

正直な答え:

  • 今は Security の一部(BCrypt)だけ 使っている
  • URL 保護・CSRF・セッション固定対策などは フレームワーク任せではなく、自分で書いた部分と未対応部分がある

本番なら:

  • spring-boot-starter-securityFilter チェーン に任せる
  • ログイン必須 URL を @PreAuthorizeauthorizeHttpRequests で一括設定
  • 重複した if (session == null) を減らせる

言い方の例:

学習目的でセッションの流れを理解した。本番規模なら Spring Security に寄せる。


6. 「CSRF 対策は?」(かなり聞かれやすい)

現状:

  • Spring Security 未導入のため、標準の CSRF トークン保護は入っていない
  • フォームは method="post" のみ

答え方:

  • 「現段階では未実装。悪意あるサイトからログイン中ユーザーの POST を送られる CSRF リスクがある」
  • 「Spring Security 導入時に Thymeleaf 連携の CSRF トークンを有効にする」

知っておく用語: CSRF = ログイン済みユーザーのブラウザから、知らないうちに POST される攻撃


7. 「セッション Cookie は安全?」

Render(HTTPS)前提で話すと:

  • 本番 HTTPS なら Cookie に Secure(HTTPS のみ送信)を付けるのが望ましい
  • HttpOnly(JavaScript から読めない)で XSS による Cookie 盗難を抑える
  • Spring Security / サーバー設定で調整する話

言い方の例:

HTTPS 上で動かしている。Cookie 属性の細かい設定は Spring Security 導入時に見直す。


8. 「ログアウトはどう効く?」

答え:

  • POST /logoutsession.invalidate() でサーバー側セッションを破棄
  • 以降 JSESSIONID は無効 → 保護ページは /login

確認: ログアウト後にブラウザバックで画面が見える場合、キャッシュ表示 のことがある。再読み込みや直接 URL ではログインへ行く、を自分で試しておく。


9. 「新規登録後、なぜいきなり TOP?」

答え:

  • 登録成功後に そのままセッションをセット して redirect:/top(再ログイン不要の UX)
  • パスワードは登録時点で BCrypt 化してから保存

10. 「他ユーザーのデータを書き換えられない?」

答え:

  • プロフィール更新は セッションの emailfindByEmail自分の行だけ 更新
  • URL に userId を渡していないので、ID すり替え攻撃の面は小さい

深掘りで聞かれたら:

  • 将来 userId を URL に載せるなら、「ログイン中ユーザーと一致するか」を必ずサーバーで確認(認可 authorization

ポートフォリオ提出前の「自分用チェックリスト」

口頭説明 + デモで見せられると印象が良い。

確認 期待する動き
未ログインで /top /login
未ログインで /profile/edit /login
ログアウト後 保護 URL は使えない
誤パスワード 同じエラーメッセージ
DB の password_hash $2a$... のような BCrypt 文字列
本番 URL HTTPS(Render のデフォルト)

伝える言い方(例)

認証は セッションベース で、パスワードは BCrypt でハッシュ保存しています。保護が必要な URL は Controller でセッションを確認しています。Spring Security は BCrypt 部分だけ使い、Filter による一括保護や CSRF は 意図的に簡略化している(または今後の改善点) です。本番ポートフォリオとしては、Spring Security 導入と CSRF、Cookie 属性の hardened、環境変数での秘密情報管理(DB・AWS キー)を次のステップにしたいです。

「全部完璧」と言うより、選んだ理由 + 知っているリスク + 次にやること の3点セットが信頼される。


覚えておくとよい用語(短く)

用語 意味
認証(Authentication) 「あなたは誰か」— ログイン
認可(Authorization) 「何をしてよいか」— 他人のデータを触れない等
セッション サーバーがログイン状態を覚える仕組み
ハッシュ 一方向変換。パスワード保存用
CSRF ログイン中ユーザーの意図しない POST
ユーザー列挙 存在するメールアドレスを推測されること

関連ファイル(説明時の参照用)

ファイル 役割
LoginController.java ログイン・ログアウト、BCrypt 照合、セッション保存
UserRegistrationController.java 新規登録、登録後の自動ログイン
UserRegistrationService.java パスワードの BCrypt 化、DB 保存
TopController.java セッション確認 → 未ログインなら redirect
ProfileEditController.java プロフィール編集のセッション確認
V1__create_users.sql password_hash 列の定義
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?