- JWT は、ヘッダー、ペイロード、署名の 3 つの部分からなるコンパクトな署名付きトークンです。
- 署名はトークンが変更されていないことを証明するため、サーバーは検索せずにトークンを信頼できます。
- ペイロードは誰でも読み取り可能なので、シークレットを入れないでください。
- トークンは取り消すのが難しいため、有効期間を短くし、信頼できるライブラリで検証してください。
ログイン後、サーバーはその後の各リクエストが実際にユーザーからのものであることをどのようにして知るのでしょうか?よくある答えの 1 つは、JSON Web トークン (JWT) で、通常は「ジョット」と発音されます。これは、クライアントがリクエストごとに送信する小さな署名されたデータであり、サーバーはデータベースに触れることなくそれを確認できます。
JWT を理解する最も早い方法は、JWT を構築してからそれを壊してみることです。 Python 3.13 上で Python の標準ライブラリのみを使用してこれを実行しました。以下の出力はその実行から得られます。 このコードは学習用です。 実際のアプリケーションでは、検証の詳細が間違いやすいため、よく整備されたライブラリを使用してください。
JWTとは何ですか?
JWT は、2 者間でクレームをコンパクトな文字列として渡すためのオープン標準であり、RFC 7519 で定義されています。クレームとは、「このユーザーの ID は 42 です」などの単なるステートメントです。トークンは署名されているため、受信者は誰が発行したか、誰も変更していないことを確認できます。
お祭りのリストバンドを思い浮かべてください。ゲートのスタッフがチケットを一度確認し、偽造が難しいバンドを渡します。その後、各屋台はチケット売り場に電話する必要がなく、バンドを眺めるだけです。 JWT は API とほぼ同じように機能します。
JWT ログインの仕組み
- ユーザーは、ユーザー名とパスワードをログイン エンドポイントに送信します。
- サーバーはそれらをチェックし、署名付きトークンを作成します。
- クライアントはトークンを保存します。
- 以降の各リクエストには、通常はヘッダーにそれが含まれます:
Authorization: Bearer <token>。 - サーバーは署名と有効期限を検証し、クレームを読み取ります。
主な利点はステップ 5 にあります。サーバーはセッションを検索する必要がないため、多くのサービスまたはサーバーが同じトークンをチェックする必要がある場合に便利です。 API を初めて使用する場合は、API とはから始めてください。
JWT の 3 つの部分
JWT はランダムなテキストのように見えますが、Base64URL でエンコードされた 3 つのセクションがドットで区切られています。私たちが生成したものは次のとおりです。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiI0MiIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNzkzNTAwMDAwLCJleHAiOjE3OTM1MDA5MDB9
.7YfUDH_T-iDh8bMmUT8mmKYwOstzT8Ty--DTTAmQGWM
読みやすくするために改行を追加しました。最初の 2 つの部分をデコードすると、プレーンな JSON が得られます。
Header: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"42","role":"user","iat":1793500000,"exp":1793500900}
| パート | 含まれています | 目的 |
|---|---|---|
| ヘッダー | トークンの種類と署名アルゴリズム | トークンを検証する方法を説明します |
| ペイロード | ユーザーまたはセッションに関するクレーム | 実際の情報 |
| 署名 | キーを使用した最初の 2 つの部分のハッシュ | 誠実さと出所を証明する |
標準的な主張
| クレーム | 名前 | 意味 |
|---|---|---|
サブ |
件名 | トークンの対象者、通常はユーザー ID |
です |
発行者 | トークンを作成した人 |
オード |
観客 | トークンの対象者 |
経験値 |
有効期限 | トークンの有効期限が切れたとき |
イアット |
発行日 | 作成されたとき |
nbf |
以前はなかった | 有効になり始めるとき |
jti |
JWT ID | このトークンの一意の ID |
role のようなカスタム クレームを追加することもできます。時間は秒単位の Unix タイムスタンプです。トークンはリクエストごとに送信されるため、ペイロードは小さくしてください。
自分で構築してみよう
トークンの作成には、2 つの JSON 部分をエンコードし、HMAC-SHA256 を使用してシークレットで署名することが含まれます。
import base64, hashlib, hmac, json
SECRET = b"demo-secret-do-not-use-in-production"
def b64url(data):
return base64.urlsafe_b64encode(data).rstrip(b"=").decode()
def sign(message):
return b64url(hmac.new(SECRET, message.encode(), hashlib.sha256).digest())
def create_token(payload):
header = {"alg": "HS256", "typ": "JWT"}
parts = [
b64url(json.dumps(header, separators=(",", ":")).encode()),
b64url(json.dumps(payload, separators=(",", ":")).encode()),
]
message = ".".join(parts)
return message + "." + sign(message)
検証は、署名を再計算し、トークン内の署名と比較することによって機能します。シークレットを知っている人だけが、一致するシークレットを作成できます。
def verify_token(token, now):
header, payload, signature = token.split(".")
expected = sign(header + "." + payload)
if not hmac.compare_digest(signature, expected):
raise ValueError("bad signature")
claims = json.loads(b64url_decode(payload))
if claims["exp"] < now:
raise ValueError("token expired")
return claims
有効なトークンは期待どおりにクレームを返しました。 compare_digestは一定時間で実行され、タイミングの違いによる情報漏洩を避けるために使用されます。
改ざんしてみてください
攻撃者がペイロードをデコードし、"role":"user" を "role":"admin" に変更し、再度エンコードして古い署名を保持したとします。私たちはこれを他の 2 つの攻撃とともに試しました。
| 試みる | 結果 |
|---|---|
| ロールを管理者に変更しました | 悪い署名 |
| 有効期限が切れてから 1 秒後にトークンを使用しました | トークンの有効期限が切れました |
"alg":"none"を設定し、署名を削除しました |
悪い署名 |
その最後の試みは、歴史的な真の弱点を狙っています。一部のライブラリはかつてトークン自身のヘッダーを信頼していたため、攻撃者は署名が必要ないと単純に宣言できました。私たちのコードは常に 1 つの固定アルゴリズムを使用しているため、それが拒否されました。実際のライブラリでは、受け入れるアルゴリズムを常に指定してください。
署名済み、暗号化されていない
これは、JWT に関して最も誤解されている点です。偽造トークンは拒否されましたが、その内容は依然として完全に読み取ることができました。
{"sub":"42","role":"admin","iat":1793500000,"exp":1793500900}
Base64URL は暗号化ではなくエンコードであり、キーをまったく使用せずに誰でもそれを元に戻すことができます。この署名は、ユーザーがデータを変更することを阻止しますが、データを読み取ることを阻止しません。したがって、パスワード、カード番号、またはプライベートな個人データを JWT ペイロードに絶対に含めないでください。コンテンツを隠す必要がある場合は、暗号化トークン (JWE) を使用するか、サーバー上にデータを保持します。
HS256 vs RS256
| アスペクト | HS256 | RS256 または ES256 |
|---|---|---|
| 種類 | 対称 | 非対称 |
| キー | 1 つの共有秘密 | 秘密鍵は署名し、公開鍵は検証します |
| トークンを作成できる人 | 秘密を握っている人は誰でも | プライベートキーホルダーのみ |
| こんな方に最適 | 1 つのサービス、または小規模な信頼できるグループ | 多くのサービス、サードパーティ、ID プロバイダー |
非対称署名を使用すると、他のサービスは独自のトークンを生成できなくてもトークンを検証できるため、侵害された場合の被害を制限できます。
JWT とセッション
JWT は、セッションの最新の代替として提供されることがよくあります。実際には、それぞれにトレードオフがあります。
| アスペクト | サーバーセッション | JWT |
|---|---|---|
| 州が住んでいる場所 | サーバー上で | トークン内 |
| 各リクエストのルックアップ | 通常 | 必要ありません |
| ログアウトまたは取り消し | 簡単です、セッションを削除します | 期限切れ前に難しい |
| リクエストあたりのサイズ | 小さなID | より大きなトークン (私たちのトークンは 161 文字でした) |
| 多くのサービスにわたって | 共有ストレージが必要 | それぞれが直接確認できます |
| 権限の変更 | すぐに適用されます | 古いトークンは有効期限が切れるまで有効です |
従来のサーバーでレンダリングされる Web サイトの場合、多くの場合、セッション Cookie の方がシンプルで安全です。 JWT は、複数のサービスで使用される API やモバイル クライアントにとってより意味のある傾向があります。
ヒント: ステートレスに見えるという理由だけで JWT を選択しないでください。実際のシステムの多くは、ログアウトをサポートするために拒否リストまたはデータベース チェックを追加します。これにより、JWT が回避するはずだった検索が復活します。
ブラウザ内のトークンを保存する場所
| 場所 | XSS リスク | CSRFリスク | 注意事項 |
|---|---|---|---|
ローカルストレージ |
高 (スクリプトで読み取れるため) | 低い | シンプルですが、挿入されたスクリプトに公開されます |
| HTTP のみのクッキー | スクリプトが読み取れないため、これより低い | 保護が必要です | SecureとSameSiteを使用します |
| インメモリ変数 | 下位 | 低い | 更新時に失われるため、更新フローが必要です |
多くのセキュリティ ガイドでは、Web アプリの HttpOnly、Secure、SameSite Cookie を支持しています。どちらを選択しても、常に HTTPS を使用してください。 JavaScript からトークンを送信するには、JavaScript Fetch API チュートリアルを参照してください。
リフレッシュトークン
有効期限が短いため、トークンの盗難による被害は限定されますが、15 分ごとにログインしたい人はいません。通常のソリューションでは 2 つのトークンを使用します。
- アクセス トークン: 有効期間は数分などと短く、API リクエストごとに送信されます。
- リフレッシュ トークン: 有効期間が長く、より慎重に保存され、新しいアクセス トークンを取得するためにのみ使用されます。
サーバーはリフレッシュ トークンを追跡するため、リフレッシュ トークンを取り消すことができ、これにより実質的なログアウトが可能になります。使用するたびにトークンをローテーションすると、盗まれた古いトークンが再生されるため、盗難の検出にも役立ちます。
よくあるセキュリティ上の間違い
- 検証せずにデコードする。 ペイロードを読み取っても、それが信頼できるものであるとは限りません。必ず署名を確認してください。
- 任意のアルゴリズムを受け入れる。 許可されるアルゴリズムの明示的なリストを設定します。
- 弱いシークレットの使用。 短いシークレットはオフラインで解読される可能性があります。長いランダム値を使用し、ソース管理外に保管してください。
- 有効期限をスキップします。
expのないトークンは、盗まれた場合でも永久に機能します。 -
issとaudをチェックしません。 そうしないと、あるサービスに対して発行されたトークンが別のサービスで受け入れられる可能性があります。 - 古いクレームを信頼する。 トークン内のロールは、有効期限が切れるまで期限切れになる可能性があります。
- ロギング トークン。 ログを読む人は誰でもトークンを再利用できます。
- 障害パスをテストしません。 有効なトークンだけでなく、期限切れおよび変更されたトークンのテストを追加します。 Postman を使用した API テストガイドが役に立ちます。
まとめ
JWT は、サーバーが検索なしで信頼できる署名付きデータであり、シークレット コンテナーやセッション間の自動アップグレードではありません。有効期限を短くし、メンテナンスされたライブラリですべてを検証し、プライベート データがペイロードに含まれないようにします。自分の目で確認するには、私たちのような小さなスクリプトを実行し、トークンの 1 文字を変更して、検証が失敗するのを見てください。
よくある質問
JWT は何に使用されますか?
JWT は主に、API での認証と認可に使用されます。ログイン後、クライアントは各リクエストとともにトークンを送信し、サーバーはそれを検証してユーザーを識別します。
JWTは暗号化されていますか?
通常はそうではありません。標準の JWT は署名およびエンコードされているため、誰でもそのペイロードを読み取ることができます。署名は変更を防ぐだけです。暗号化されたトークンは、JWE と呼ばれる関連形式を使用します。
JWT はどれくらいの期間存続する必要がありますか?
アクセス トークンは通常、有効期間が短く、数日ではなく数分であることがよくあります。これらをリフレッシュ トークンと組み合わせると、ユーザーは常にログインする必要がなくなります。
JWT を取り消すことはできますか?
有効期限が切れるまで有効であるため、それ自体ではありません。取り消しには拒否リストなどのサーバー側の追跡が必要ですが、これによりステートレスの利点の一部が失われます。
JWT はセッションよりも優れていますか?
どちらが常に良いというわけではありません。セッションは取り消しが簡単で多くの Web サイトに適していますが、JWT は ID を個別に検証する必要がある API やサービスに適しています。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェアテストユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例
ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。
記事を読む →データベースとSQLSQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ
SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。
記事を読む →データベースとSQLSQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。
記事を読む →ソフトウェア開発JWTとは何ですか? JSON Web トークンを実際の例で説明する
JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。
記事を読む →ソフトウェア開発JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例
JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。
記事を読む →ソフトウェア開発Python ジェネレーターと収量の説明: 実際の例でメモリを節約する
Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。
記事を読む →人工知能埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明
埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。
記事を読む →DevOpsBlue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法
ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。
記事を読む →テスト自動化不安定なテスト: 問題の原因とそれを永久に修正する方法
不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。
記事を読む →ソフトウェアテスト負荷テストとストレス テスト: 違い、メトリクス、および k6 の例
ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。
記事を読む →ソフトウェアテストテスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか
テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。
記事を読む →データベースとSQLSQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正
SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。
記事を読む →データベースとSQLSQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス
SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。
記事を読む →ソフトウェア開発JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト
ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。
記事を読む →ソフトウェア開発Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例
Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。
記事を読む →ソフトウェア開発Python のクラスとオブジェクト: 実際の例を含む OOP チュートリアル
Python のクラスとオブジェクトについて、実行したコードとともに説明します: __init__、メソッド、クラスとインスタンスの属性、継承、プロパティ、ダンダー メソッド、データクラス、およびよくある間違い。
記事を読む →人工知能大規模言語モデルとは何ですか? LLM の仕組みを誇大広告なしで説明
大規模言語モデルとは何ですか? LLM は、トークン、エンベディング、アテンション、トレーニング、温度およびコンテキスト ウィンドウ、小さな次の単語のデモ、実際の制限など、平易な言葉で説明されています。
記事を読む →DevOps初心者のための Linux コマンド: 例を含む基本ターミナル ガイド
初心者向けの Linux コマンド。ナビゲーション、ファイル、ログの表示、grep、パイプ、権限、プロセス、アーカイブなどのタスク別にグループ化されており、実用的なログ分析の例も含まれています。
記事を読む →テスト自動化Selenium と Playwright: 主な違い、コードの比較、どちらを選択するか
Selenium と Playwright の比較: アーキテクチャ、待機、ブラウザと言語のサポート、デバッグ、両方のツールでの同じテスト、移行のアドバイスと選択方法。
記事を読む →ソフトウェアテスト等価性分割: テスト設計手法を実際の例で説明
等価性パーティション化について説明しました。有効なパーティションと無効なパーティションを見つける方法、年齢、パスワード、クーポンに関する実際の例、実行したテスト、境界と組み合わせる理由。
記事を読む →ソフトウェアテストソフトウェアテストにおける重大度と優先度: 相違点、マトリックス、および実際の例
ソフトウェア テストにおける重大度と優先度について説明します。明確な定義、例を含む 4 方向のマトリックス、レベル スケール、それぞれの設定者、バグ トリアージの実行方法。
記事を読む →データベースとSQLSQL サブクエリのチュートリアル: 型、相関サブクエリ、および EXISTS と例
実行したクエリを含む SQL サブクエリのチュートリアル: スカラー、IN、FROM、SELECT サブクエリ、相関サブクエリ、EXISTS、NOT IN NULL トラップ、サブクエリ対 JOIN 対 CTE。
記事を読む →データベースとSQLSQL トランザクションと ACID の説明: COMMIT、ROLLBACK、分離レベル
SQL トランザクションと ACID について、実行した銀行振込で説明しました。COMMIT、ROLLBACK、セーブポイント、ロック、分離レベル、ダーティ リード、デッドロック、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →