認証と認可
安全なユーザー認証(例:JWT)と認可の仕組みを実装し、ウェブサービスのエンドポイントを保護します。
「認証と認可」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全3レッスンが含まれています。
Webサービスを安全にする
ようこそ!このレッスンでは、Rustで安全なWebサービスを構築するうえで重要な概念であるAuthenticationとAuthorizationについて詳しく学びます。
正当なユーザーだけがAPIエンドポイントにアクセスでき、さらに適切な権限を持つ場合にのみ利用できるように、APIを保護する方法を学びます。
AuthenticationとAuthorizationの違い
この2つの用語は似ていますが、意味は異なります。
- Authentication:本人が誰であるかを確認します。建物に入るときに身分証を提示するようなものです。
- Authorization:何を実行することが許可されているかを判断します。建物に入った後、どの部屋に入れるかを決めるものです。
RustのWebサービスを保護するために、両方を実装します。
APIを保護する理由
APIエンドポイントを保護することは、次のような理由から重要です。
- データのプライバシー:機密性の高いユーザーデータを不正アクセスから守ります。
- システムの完全性:悪意のある攻撃者によるデータの改ざんや破壊を防ぎます。
- コンプライアンス:法令や規制上の要件(GDPRやHIPAAなど)を満たします。
堅牢なセキュリティレイヤーは信頼を築き、アプリケーションを保護します。
JSON Web Tokens(JWT)
現代のWebサービスでAuthenticationに広く使われている方法の1つが、JSON Web Tokens(JWT)(「ジョット」と発音します)です。
JWTは、2者間で転送するクレームを表現するための、コンパクトでURLセーフな手段です。ステートレスなAuthenticationによく使われます。
つまり、サーバーはユーザーごとのセッション情報を保存する必要がありません。
JWTの構成要素:Header、Payload、Signature
JWTは、ドットで区切られた3つの部分で構成されます。
- Header:トークンの種類(JWT)や署名アルゴリズム(HS256など)といった、トークンに関するメタデータを含みます。
- Payload:「クレーム」、つまりエンティティ(通常はユーザー)に関する記述と追加データを含みます。
- Signature:トークンが改ざんされていないことを検証するために使います。秘密鍵を使ってHeaderとPayloadをエンコードして作成します。
RustでのJWTの生成と検証
Rustのjsonwebtokenクレートを使ってJWTを生成および検証する方法を見てみましょう。Cargo.tomlにjsonwebtoken、("derive"機能付きの)serde、("serde"機能付きの)chronoを追加する必要があることを覚えておいてください。
この例では、トークンを生成してから、すぐに検証します。
use jsonwebtoken::{encode, decode, Header, EncodingKey, DecodingKey, Validation};
use serde::{Deserialize, Serialize};
use chrono::{Utc, Duration};
#[derive(Debug, Serialize, Deserialize)]
struct Claims {
sub: String, // Subject (user ID)
company: String,
exp: usize, // Expiration time
}
fn main() {
// --- Setup (requires crates: jsonwebtoken, serde, chrono) ---
let secret_key = "my_super_secret_key";
// --- 1. Generate a JWT ---
let my_claims = Claims {
sub: "user123".to_string(),
company: "CoddyKit".to_string(),
exp: (Utc::now() + Duration::minutes(10)).timestamp() as usize,
};
let token = encode(
&Header::default(),
&my_claims,
&EncodingKey::from_secret(secret_key.as_ref()),
).expect("Failed to encode token");
println!("Generated JWT:\n{}", token);
println!("\n--- Verifying the Token ---");
// --- 2. Verify the JWT ---
let validation = Validation::default();
let decoded_result = decode::<Claims>(
&token,
&DecodingKey::from_secret(secret_key.as_ref()),
&validation,
);
match decoded_result {
Ok(token_data) => {
println!("Token valid!");
println!("Subject: {}", token_data.claims.sub);
println!("Company: {}", token_data.claims.company);
},
Err(err) => println!("Token invalid: {:?}", err),
}
}Authorization:アクセスの定義
ユーザーのAuthenticationが完了すると(本人が誰かがわかると)、authorizationによって、アクセスを許可するリソースや実行可能な操作を決定します。
一般的なAuthorizationモデルには、次のようなものがあります。
- Role-Based Access Control(RBAC):ユーザーにロール(「admin」「editor」「viewer」など)を割り当て、ロールごとに固有の権限を設定します。
- Attribute-Based Access Control(ABAC):ユーザー、リソース、または環境の属性に基づいてアクセスを許可します。
Authorizationミドルウェアの概念
Webサービスでは、Authorizationをmiddlewareで処理することがよくあります。middlewareとは、メインのルートハンドラーより前に実行されるコードです。
middlewareでは、次の処理を行います。
- Authentication済みユーザーの識別情報を(JWTなどから)取り出します。
- ユーザーのロールや権限を、リクエストされたエンドポイントに必要なアクセス権と照合します。
- 権限があればリクエストの処理を続行し、なければ「Unauthorized」または「Forbidden」エラーを返します。
これにより、ルートハンドラーをすっきり保ち、ビジネスロジックに集中できます。
理解度チェック
AuthenticationとAuthorizationについて、理解度を簡単に確認してみましょう。
まとめ:Webサービスの保護
よくできました!このレッスンでは、RustのWebサービスを保護するための基本を学びました。
- Authentication(本人が誰か)とAuthorization(何を実行できるか)の違い。
- APIエンドポイントを保護することの重要性。
- JSON Web Tokens(JWT)がステートレスなAuthenticationでどのように機能するか、およびその構造。
- JWTを生成・検証するRustの実践例。
- Role-Based Access Controlの概念と、middlewareでAuthorizationのチェックを実装する方法。
これで、より安全で堅牢なRustアプリケーションを構築する準備が整いました。
よくある質問
「認証と認可」レッスンは無料ですか?
はい。「認証と認可」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全3レッスンが含まれています。
「認証と認可」で何を学びますか?
安全なユーザー認証(例:JWT)と認可の仕組みを実装し、ウェブサービスのエンドポイントを保護します。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「認証と認可」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。