HTTPステータスコード「401」と「403」の違いとして正しいものはどれか。
解説
401(Unauthorized)は「あなたが誰か分からない」、403(Forbidden)は「あなたが誰かは分かったが、権限がない」という違いです。名前が紛らわしいですが、401は認証(Authentication)の失敗、403は認可(Authorization)の失敗を意味します。どちらもクライアントエラー(4xx系)なので、「片方がサーバーエラー」という説明も誤りです。認証と認可はどう違うのかこの2つはセットで語られますが、役割は明確に異なります。認証(Authentication): 「あなたは誰ですか?」を確認する処理。ログイン、トークン検証、APIキーの確認など認可(Authorization): 「あなたにその操作をする権限がありますか?」を確認する処理。ロール判定、アクセス制御など認証が通らなければ401、認証は通ったが権限がなければ403、という順番です。実務での使い分けAPI設計で混同されがちなポイントがあります。トークン未送信・期限切れ → 401を返す。クライアントに再ログインを促す意味がある一般ユーザーが管理者用エンドポイントにアクセス → 403を返す。再ログインしても結果は変わらないことを示す401には「再認証すればアクセスできるかもしれない」というニュアンスがあり、403には「何をしても無駄」というニュアンスがあります。この違いを意識すると、フロント側でエラーハンドリングを分岐させやすくなります。例えば401ならログイン画面へリダイレクト、403なら「権限がありません」と表示する、といった設計です。なお、セキュリティ上の理由からあえて403の代わりに404を返すケースもあります。リソースの存在自体を隠したい場合です。GitHub のプライベートリポジトリに未認証でアクセスすると、403ではなく404が返ってくるのはこのパターンです。