ユーザー認証方法|Hachinet Software
この記事では、Webアプリケーションを構築する上で最も重要な問題の1つであります。これがユーザーの身元を確認する方法です。まず、ユーザー認証とユーザー承認の2つの概念を理解する必要があります。適切なユーザー識別および認証方法を実装することにより、信頼できるデジタルトランザクションを作成する方法を学びます。
2022年03月29日

この記事では、Webアプリケーションを構築する上で最も重要な問題の1つであります。これがユーザーの身元を確認する方法です。まず、ユーザー認証とユーザー承認の2つの概念を理解する必要があります。適切なユーザー識別および認証方法を実装することにより、信頼できるデジタルトランザクションを作成する方法を学びます。
この記事では、Webアプリケーションを構築する上で最も重要な問題の1つがあります。これがユーザーの身元を確認する方法です。まず、ユーザー認証とユーザー承認の2つの概念を理解する必要があります。適切なユーザー識別および認証方法を実装することにより、信頼できるデジタルトランザクションを作成する方法を学びます。
Authentication / Authorization
- ユーザー認証権限 (Authentication)は、システムにアクセスするためのデバイス又は、ユーザーのログイン情報を確認するプロセスです。
- ユーザー委託(Authorization)は、ユーザーまたはデバイスが特定のシステムで特定のタスクを実行することを承認されているかどうかを確認するプロセスです。
→ 簡単に説明します。
- Authenticationは、「誰であるか?」の質問です。
- Authorizationは、「何がさせられますか?」の問題です。
Authenticationは常に「Authorization」前に行われることを理解できます。つまり、Authorizationを実行する前に自分のIDを認証する必要があります。そのため、Webアプリケーションに対しては、「委託」またはユーザー認証にはどのような方法がありますか?
1.HTTP/HTTPS
ユーザーのID認証がどのように識別されるかを理解するには、まずWebサイトが使用しているプロトコルを理解する必要があります。ここでは「HTTP」「HTTPS」です。2つのプロトコルの違いは、HTTPSデータが安全であるということです。 ただし、クライアントとサーバー間で個別に要求/応答を実行します。
クライアントがサーバーに要求を行うことで、 サーバーはデータベースにアカウントを作成し、HTTPステータス200 OKの応答に返します。 ただし、次のステートメントに関しては、サーバーはこの要求を送信するクライアントが前のクライアントであるかどうかを知ることができません。
例:一方、ウェブサイト(ブログ)では、ユーザーはアカウントを作成して投稿します。そのため、サーバーは以前のアカウント作成リクエストを判別できず、そのリクエストが同じ人物ですか。
この問題を解決するために、HTTPは各リクエストのヘッダーに認証を統合します。
【"Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" your-website.com】
ユーザーのログイン情報が再度繋がり、暗号化されます。(例:dXNlcm5hbWU6cGFzc3dvcmQ)、ここでの暗号化方法は「base64」です。
base64.
let auth = 'username:password';
let encode = btoa(auth);
let decode = atob(encode);
HTTP/HTTPSの動作の仕組み
- クライアント側は、制限されるリソースへのアクセスの要求を実装します。
- サーバーは、タイトル[WWW・基本値で認証]を使用することでHTTP 401 Unauthorized に送信します。
- その後、クライアント側は、クライアントの[ユーザー名及びにパスワード]を暗号化し、サーバーに要求します。
- サーバーがユーザーIDを認証すると、 リクエストごとに[Authorization: Basic dcdvcmQ=]セクションが追加されます。
⁂メリット
- スピードし、多くの時間が掛かっていない
- 展開が簡単になります。
- 任意のブラウザでも実行できます。
⁂デメリット
- Base64エンコード方式は簡単にデコードできます。ユーザー名とパスワードはログイン時に必要な情報であるため、ハッキングされて復号化されると、ユーザーがアカウントを失うかもしれません。
- 各リクエストでIDを認証する必要があります。
- ユーザーは、無効な情報でログインすることによってのみログアウトできます。
import basicAuth from 'basic-auth';
function unauthorized(res) {
res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
return res.send(401);};
export default function auth(req, res, next) {
const {name, pass} = basicAuth(req) || {};
if (!name || !pass) {
return unauthorized(res);
注目:場合によっては、base64の代わりにMD5を使用してエンコードできます。この件は情報の安全性が高くなるですが、効率は高くありません。
2.Session-Cookies
さらに、「session-cookies」ベースの認証では、ユーザー状態がサーバーに保存され、各リクエストにユーザー名やパスワードを要求するのではなく、最初の有効なログイン後に、ユーザーのsessionIdを作成します。次に、その件クライアントに送信され、
クライアント側 「browser 」はCookieにsessionIdを保存します。 したがって、サーバーへのリクエストがあるたびに、セッションIDを送信するだけで済みます。
以下のCookieに保存されているセッション情報:
⁂Session-Cookiesの動作の仕組み
- クライアント側は有効な認証メッセージをサーバーに送り返します。
- サーバーは情報を認証した後、セッションIDを作成して保存します。そして、ヘッダーに「Set-Cookie」を使用してHTTPに追加することにより、クライアントに反映します。
- クライアント側は、ブラウザに保存される「sessionId」を受け取ります。後続の各リクエストもサーバーに送信されています。
⁂メリット
- HTTPのリクエストに含まれる情報はsessionIdのみであるため、上記のHTTPメソッドよりも安全になります。
- ログインは必要情報が不要なため、後続のログインはより高速になります。
- 実行することは簡単です。
⁂デメリット
Cookieは便利な機能ではありますが、注意すべきシチュエーションがあります。それは、不特定多数の人が使う共用のPCやタブレット端末を使用する場合です。共用のPCやタブレット端末で個人情報を入力してWebサイトにアクセスすると、Cookieによって保存された個人情報をその後に使用する人が確認できてしまう可能性があります。
こういった場面では、Cookieをブロック・削除するか、個人情報を入力するようなWebサイトを使用しないことで情報漏洩を防ぎましょう。 また、ユーザー視点から見ると、先述したリターゲティングによる広告の表示は迷惑に感じることがあります。ユーザーがCookieをブロックしてしまう程のしつこいWeb広告の表示は避けるべきです。CSRF攻撃に対しても脆弱です。
const express = require('express');
const sessions = require('express-session');
const app = express();
const oneDay = 1000 * 60 * 60 * 24;
app.use(sessions({
secret: "thisismysecrctekeyfhrgfgrfrty84fwir767",
saveUninitialized:true,
cookie: { max Age: oneDay },
resave: false
}));
3.Token
厳密に言えば「トークン」は「暗号資産」や「仮想通貨」と同義語です。ただし、次第に文脈によっては、他の2つのより具体的な意味を持つようになってきました。第一に、ビットコインおよびイーサリアム(以外のあらゆる暗号資産を指します。
第二に、多くの分散型金融(またはDeFi)トークンがそうであるように、他の暗号資産のブロックチェーン上で動作する特定の暗号資産を指します。トークンには、分散型取引を実現することからビデオゲームの希少アイテム販売まで、多岐にわたる潜在的な機能があります。それと同時に、どのトークンも他の暗号資産のように取引したり保有できます。
トークンは暗号資産でよく聞く単語です。実際に、ビットコインは「暗号資産トークン」やその類いであるといった説明を耳にすることもあるかもしれません。これは、厳密にはすべての暗号資産がトークンであるとも言えるためです。しかし、その単語は次第に2つの具体的な意味を持つようになり十分に一般的になっているため、この意味に出くわす可能性も大いにあります。
「トークン」はしばしば、ビットコインおよびイーサリアム(厳密にはこれらもトークンですが)以外のあらゆる暗号資産を指します。トークンのもう1つの、次第に一般的になっている意味には、なお一層具体的な含みがあり、他の暗号資産のブロックチェーン上で動作する暗号資産を指します。分散型金融(またはDeFi)に興味を持つようになると、この用法に出くわすでしょう。
ビットコインのような暗号資産にはそれ専用のブロックチェーンがありますが、チェーンリンクや Aave のようなDeFiトークンは、既存のブロックチェーン上で動作したりそれを利用します。そうしたブロックチェーンで最も一般的なのはイーサリアムです。
⁂Tokenの動作の仕組み
要求:ユーザーが、サーバーまたは保護されたリソースへのアクセスを要求します。この時にパスワードを使用したログインや、指定された他のプロセスが関与することがあります。
検証:サーバーが、ユーザーがアクセスしてよいと判断します。このとき、ユーザー名とパスワードの照合や、指定された他のプロセスが関与することがあります。
トークン:サーバーが、認証デバイス(リング、キー、携帯電話など)と通信します。検証後、サーバーはトークンを発行してユーザーに渡します。
ストレージ:動作が継続する間、トークンはユーザーのブラウザ内に留まります。ユーザーがサーバーの別の部分にアクセスしようとすると、トークンはサーバーと再び通信します。アクセスは、トークンに基づいて許可または拒否されます。
管理者は、トークンの制限を設定します。たとえば、ユーザーがログアウトすると即座に破棄されるワンタイムトークンを設定できます。また、指定した期間が終了するときにトークンが自己破壊するように設定することも可能です。
JWTチェーンは、3つの部分を含む。
- Header: データ型とJWTチェーンのエンコードに使用されるアルゴリズムが含まれます。
- Payload:ユーザー名、ユーザーID、作成者等、トークン文字列に入力する情報が含まれます。
- Signature:ヘッダー・ペイロードを秘密文字列(秘密鍵)で暗号化して生成します。
例えば:data = ''base64urlEncode''( header ) + "." + base64urlEncode( payload )
signature = Hash( data, secret_key );
⁂メリット
- サイズは、このコード言語のトークンは小さく、2つのエンティティ間で迅速に受け渡しできます。
- 使いやすさ:トークンは、ほぼどこからでも生成でき、サーバーで検証する必要はありません。
- 制御:ユーザーがアクセスできる対象、そのアクセス許可の持続時間、ログオン中に実行できる操作を指定できます。
- その一方で、潜在的なデメリットもあります。
⁂デメリット
- 単一のキー:JWTは単一のキーに依存します。このキーが侵害されると、システム全体が危険にさらされます。
- 複雑さ:これらのトークンは簡単に理解できるものではありません。開発者が暗号署名アルゴリズムに関する知識を十分に持っていない場合、誤ってシステムを危険にさらす可能性があります。
- 制約:メッセージをすべてのクライアントにプッシュすることはできません。また、サーバー側からクライアントを管理することはできません。
const jwt = require('jsonwebtoken');
const generateToken = (payload) => {
return jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRE,
});
};
module.exports = generateToken;
4.OAuth
OAuthとは、複数のWebサービスを連携して動作させるために使われる仕組みです。通常、Webサービスを利用するためは、個別にユーザーIDとパスワードを入力してユーザーを認証する必要がありますが、OAuthを利用することで、IDやパスワードを入力することなく、アプリケーション間の連動ができるのです。
⁂OAuthの動作の仕組み
OAuthは、ユーザーの情報とリソースを保持しており、認証を行うアプリケーション(サービスプロバイダー)、認証を受けてサービスプロバイダーが持つユーザーリソースを操作するアプリケーション(コンシューマー)、リソースの持ち主であるユーザー、の3者がデータをやりとりして実現しています。
先ほどの例でいえば、「サービスプロバイダー」がTwitter、「コンシューマー」がオンラインアルバムアプリケーション、「ユーザー」があなたになります。
⁂メリット
・OAuth 2.0は、ユーザーのトークンを保存するためのSSLに基づく柔軟なプロトコルです。
・ユーザー情報にアクセスを許可し、認証トークンの有効期限が切れた時にアクセスを許可します。
・個人情報を公開することなく、ユーザーとデータを共有することができます。
・実装が容易で、高い信頼性です。
⁂デメリット
- 利用権限が悪用される可能性がある
- OAuthは認証情報を連携先のアプリケーション等に丸ごと渡すので、もし連携先のアプリケーション等に悪意のあるプログラムが仕込まれていた場合、利用権限が悪用され、なりすましなどの被害にあう恐れがあります。
- アカウント情報を書き換えられる可能性があります。
- OAuthの連携先にECサイトや決済のサイトがある場合、認証情報を盗まれてアカウント情報が書き換えられた結果、金銭的な被害にあう可能性があります。例えば、身に覚えのない借金やショッピングの利用等の被害にあう可能性があります。
- 定期的にフリーメールやSNSのセキュリティ設定の見直しが必要です。
- OAuthでなりすまし等の被害を防ぐためには、フリーメールやSNSのセキュリティを適切に設定することが重要です。フリーメールやSNSのセキュリティ確認のために時間が割かれる、という本末転倒な事態になる可能性があります。
const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
const GOOGLE_CLIENT_ID = 'our-google-client-id';
const GOOGLE_CLIENT_SECRET = 'our-google-client-secret';
passport.use(new GoogleStrategy({
clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: "http://localhost:3000/auth/google/callback"
},
function(accessToken, refreshToken, profile, done) {
userProfile=profile;
return done(null, userProfile);
}
));
app.get('/auth/google',
passport.authenticate('google', { scope : ['profile', 'email'] }));
app.get('/auth/google/callback',
passport.authenticate('google', { failureRedirect: '/error' }),
function(req, res) {
// Successful authentication, redirect success.
res.redirect('/success');
});
5.結論
ユーザー認証の記事はここで終わります。うまくいけば、デモコードとアクティビティは、顧客が上記の方法をよく理解するのに役立つでしょう。 特にユーザー認証はユーザーとWebサイト運営者の双方にメリットがある機能ですが、同時に悪用されてしまう危険性も持ち合わせています。ユーザーもWebサイト運営者も安全にこれらの機能を利用するためには、Authentication / Authorizationに対する理解を深めることが必要でしょう。
Web担当になったけれど自分の知識に自信がない、自社のWebページをもっと改善したい、けれども、うちにはそんな時間も人材もないというお悩みはございませんか?Hachinetではお客様に真摯に向かい、ご要望に沿ったWebサイト制作やリニューアルを行ってきました。お気軽にお問い合わせください。
オフショア開発でシステムをご検討されている方々はぜひ一度ご相談ください。
※以下通り弊社の連絡先
アカウントマネージャー: クアン(日本語・英語対応可)
電話番号: (+84)2462 900 388
お電話でのご相談/お申し込み等、お気軽にご連絡くださいませ。
- オフショア開発
- エンジニア人材派遣
- ラボ開発
- ソフトウェアテスト
電話番号: (+84)2462 900 388
メール: contact@hachinet.com
お電話でのご相談/お申し込み等、お気軽にご連絡くださいませ。
無料見積もりはこちらから
Tags
ご質問がある場合、またはハチネットに協力する場合
こちらに情報を残してください。折り返しご連絡いたします。
関連記事

設計書とは?基本設計書・詳細設計書の書き方、現場で使えるテンプレート構成を徹底解説!【保存版】
システム開発において、「設計書」はただのドキュメントではなく、開発チーム全体をつなぐ“共通言語”として非常に重要な役割を果たします。要件を満たしたシステムを効率よく、かつ高品質に構築するためには、基本設計書と詳細設計書を正しく作成・活用することが不可欠です。しかし、現場では「どこまで書けばいいのか」「何を含めるべきか」に悩む声も少なくありません。本記事では、設計書の基本構成から具体的な書き方、各項目のポイントまでわかりやすく解説していきます。

設定書とは?仕様書との違いと現場での使い分けを徹底解説
システム開発やインフラ構築の現場において、「設定書」はプロジェクトの再現性・安定稼働・保守性を支える不可欠なドキュメントです。しかし「仕様書との違いがよく分からない」「どうやって書けばいいか曖昧」と感じる方も少なくありません。本記事では、設定書の定義や目的を明確にし、仕様書との違いや使い分け方、実際の記載例、現場で活用されるベストプラクティスまで、現役エンジニア視点でわかりやすく解説します。これからドキュメント整備に取り組む方、品質向上を図りたいプロジェクトマネージャー、開発・運用双方の立場を理解したい方にとって、実践的で有益な内容となっています。

「外部設計」と「内部設計」とは?それぞれの違いと作業内容を解説
システム開発において、「設計書」は単なる形式的な書類ではなく、プロジェクトの成否を大きく左右する重要なドキュメントです。開発スピードや柔軟性が求められる現代においても、設計書をしっかりと整備することで、品質の高いソフトウェア開発、チーム内の認識共有、そして保守性・拡張性の確保につながります。本記事では、設計書の基本から外部設計・内部設計の違い、良い設計書の条件まで、10年以上の実務経験を踏まえてわかりやすく解説します。

設計書とは?基本設計書と詳細設計書の違い・書き方・チェック項目を徹底解説
システム開発において、「設計書」はプロジェクトの成否を左右する非常に重要なドキュメントです。要件定義から実装、テスト、運用に至るまで、すべての工程において設計書が正しく整備されているかどうかで、品質や納期、メンテナンス性に大きな影響を与えます。特に「基本設計書」と「詳細設計書」は役割が異なり、それぞれの目的や構成を正しく理解して書き分けることが求められます。本記事では、設計書の基本から、具体的な記載項目、レビュー時のチェックポイントまでを、実務経験をもとにわかりやすく解説していきます。

シナリオテストとは?書き方・作り方・具体例まで徹底解説
現代のソフトウェア開発では、単なる機能テストだけではユーザー満足を得ることが難しくなっています。そんな中で注目されているのが「シナリオテスト」という手法です。ユーザーの実際の操作フローに沿ってシステムを検証することで、より現実的なバグ検出やUX改善が可能になります。本記事では、シナリオテストとは何か、その作り方・書き方・具体例まで、初心者でも実践できる内容を丁寧に解説します。

シナリオテストとは?単体テストとの違いと実施ポイントをわかりやすく解説
現代のソフトウェア開発において、「テスト」は単なるバグ探しではなく、ユーザー体験と品質を守るための戦略的なプロセスとなっています。その中でも「シナリオテスト」は、実際の業務フローやユーザー操作に基づいてアプリケーション全体の動作を確認できるテスト手法として、ますます注目を集めています。一方で、「単体テストとの違いがわからない」「どう設計すれば良いのか不明」といった悩みも多く聞かれます。本記事では、シナリオテストの基本的な概念や目的、単体テストとの違い、実施方法、現場での課題と対策までを網羅的に解説し、初心者から実務担当者まで役立つ内容を丁寧に紹介します。

シナリオテストとは?結合テストとの違い・実施ポイントを徹底解説
現代のソフトウェア開発において、品質保証はプロダクトの信頼性とユーザー満足度を左右する極めて重要な工程です。中でも、実際のユーザー行動を再現してテストを行う「シナリオテスト」は、単なる機能検証では見落とされがちな課題を浮き彫りにする手法として注目されています。本記事では、シナリオテストの定義や特徴、設計のポイントを解説するとともに、よく混同されがちな「結合テスト」との違いについてもわかりやすく整理します。

シナリオテストとは?目的・書き方・注意点まで徹底解説【現場で役立つ実践ガイド】
システム開発が複雑化し、ユーザー体験が重視される現代において、単なる機能確認では不十分な時代となりました。そこで注目されているのが「シナリオテスト」です。これは実際のユーザー操作や業務フローを再現しながら、アプリやシステムが期待通りに動作するかを総合的に検証するテスト手法です。本記事では、シナリオテストの定義から書き方、現場での活用方法や注意点まで、ITエンジニア・QA担当者・PM向けにわかりやすく解説していきます。

AIで不良品を検出?Pythonで製造業向け画像検査システムを作ってみた
近年、製造業の現場ではAI技術の導入が急速に進んでおり、なかでも「Pythonによる画像認識」は、不良品の自動検出や検査工程の省力化を実現する手段として注目を集めています。従来の目視検査は人手や経験に依存する部分が多く、検査ミスや属人化といった課題がありましたが、AIを活用すれば、より安定した品質管理と作業効率の向上が可能になります。本記事では、「Python 画像 認識」をキーワードに、実際に製造業向けの画像検査システムを構築した事例を交えながら、使用した技術や開発の流れ、実運用に向けたポイントについて詳しく解説していきます。

【リアルタイム画像認識入門】PythonとYOLOv8で物体検出をはじめよう!
AIやディープラーニング技術の進化により、「画像認識」はもはや研究室だけのものではなく、誰でも手軽に扱える技術となりました。中でも、物体検出アルゴリズム「YOLO」は、高速かつ高精度なリアルタイム処理が可能で、実用性の高さから注目を集めています。本記事では、Pythonを使ってYOLOv8を実装し、リアルタイムで物体を検出する方法を、初心者にも分かりやすく解説します。

Pythonを使った画像認識の始め方|初心者でもできるステップ
近年、AI技術の急速な進歩により、画像認識は医療、製造、自動運転など幅広い分野で重要な役割を担っています。中でもPythonは、豊富なライブラリと扱いやすさから、初心者でも手軽に画像認識の開発に挑戦できる言語として注目されています。本記事では、Pythonを使った画像認識の基本的な手順から初心者におすすめの学習方法まで、専門知識を持つ筆者が分かりやすく解説します。これから画像認識を学びたい方やAI技術に興味のある方の入門ガイドとして役立つ内容です。

Pythonを使った画像認識とは?仕組み・活用例・おすすめライブラリを徹底解説【OpenCVも紹介】
近年、AI技術の進化により、「画像認識」は様々な業界で注目される技術となりました。なかでも、Pythonはそのシンプルな構文と豊富なライブラリ群により、画像認識の開発現場で最も選ばれているプログラミング言語の一つです。製造現場での外観検査、小売業での棚在庫管理、医療分野での画像診断など、用途は年々拡大しています。本記事では、Pythonを使った画像認識の基本的な仕組みから、実際にできること、業務活用の視点、さらにはOpenCVを活用した開発手法まで、専門的な内容をやさしく解説します。画像認識に興味のあるエンジニア、業務へのAI活用を検討している方、そしてDXを推進したい企業担当者にとっても、実践的なヒントが得られる内容となっています。

【2025年最新版】AIで進化するウォーターフォール開発|エラー削減・効率化を実現するスマート統合とは?
ウォーターフォール開発は、要件の安定性や厳格な管理体制が求められるシステム開発において、今なお多くの企業で活用されています。しかし、変化の激しい現代においては、その柔軟性の低さや開発スピードの遅さが課題視されがちです。そこで注目されているのが、AI(人工知能)との統合です。本記事では、AIを活用してウォーターフォール開発をどのように効率化・高度化できるのか、具体的な活用方法や導入事例、最新のスマートツールまで、10年以上IT領域で執筆を続ける筆者が徹底的に解説します。

ウォーターフォール×アジャイルの融合:2025年型ハイブリッド開発とは?
長らく「古い開発モデル」として見られてきたウォーターフォールモデル。しかし、現実の現場では未だに多くの企業がこのモデルを採用し続けています。特に大規模プロジェクトや、金融・医療・公共系のシステム開発では、その構造化された進行と明確なドキュメント管理が重視されています。一方、アジャイル開発は「スピードと柔軟性」を重視する現代的な手法として広がりを見せましたが、管理や品質面での課題が浮き彫りになる場面もあります。そのような背景から、今業界で注目されているのが「ハイブリッド開発」。

ウォーターフォールとアジャイルの違いとは?徹底比較&実践ガイド
近年、システム開発の現場ではアジャイル開発が注目される一方で、ウォーターフォール開発も根強い支持を受けています。どちらの手法にもメリット・デメリットがあり、プロジェクトに応じた選択が重要です。本記事では、両者の違いを7つの観点から徹底比較し、さらに使い分けのポイントやハイブリッド開発の可能性についても解説します。

ウォーターフォール開発とは?流れ・メリット・デメリットやさしく解説!
システム開発やWebアプリ制作の話をするとき、「ウォーターフォール開発」という言葉を聞いたことがある方も多いのではないでしょうか?特に企業での大規模プロジェクトや、SIerなどの受託開発でよく採用される伝統的な手法の一つです。この記事では、ウォーターフォール開発の特徴から流れ、メリット・デメリット、そして他の開発モデルとの違いまで、初心者の方でもわかりやすく丁寧に解説します。