導入:その認証、古くないですか?
Webアプリケーション開発において、認証機能の実装は避けて通れません。
しかし、まだ「とりあえずセッション」だけで済ませていませんか?
現代のアーキテクチャ、特にマイクロサービスやSPA(Single Page Application)との連携には、JWT(JSON Web Token)によるトークンベースの認証が求められるケースが増えています。
この記事では、Java×Spring Bootで「セッション認証」と「JWT認証」の両方を実装し、それぞれの使い分けやセキュリティの考慮点も詳しく解説します。
1. Spring Bootでの認証方式の種類
Spring Bootでは、以下のような認証方式をサポートしています。
認証方式 | 特徴 |
---|---|
セッション認証 | 古典的な方式。Spring Security標準機能。 |
JWT認証 | REST APIやSPAで主流。ステートレス。 |
OAuth2 | 外部連携(Google, GitHub等)に便利。 |
2. セッション認証の基本と実装例
● 概要
セッションIDをCookieに保存し、ログイン状態を維持します。
Spring SecurityのHttpSession
が自動管理してくれます。
● 実装ステップ
- 依存ライブラリ(
spring-boot-starter-security
)を追加 WebSecurityConfigurerAdapter
を継承して設定- ログイン用のControllerとViewを作成
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login", "/register").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home", true)
.and()
.logout()
.logoutSuccessUrl("/login?logout");
}
}
3. JWT認証の基本と実装例
● JWTとは?
JWTは、認証情報を含んだ自己完結型のトークンで、サーバー側で状態を保持しません。
API認証に最適で、フロントエンドと分離された構成に向いています。
● 典型的なJWT構成
- ユーザーがログイン → サーバーがJWTを発行
- JWTはクライアントに保存(例:LocalStorage)
- APIリクエスト時に
Authorization: Bearer トークン
として送信
● 実装ステップ
- JWTライブラリの導入(例:
jjwt
) - 認証処理でJWTの発行・検証ロジック追加
OncePerRequestFilter
でリクエストごとにトークン検証
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key";
public String generateToken(UserDetails userDetails) {
return Jwts.builder()
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10時間
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public String extractUsername(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
4. セッションとJWTの違い・使い分け
項目 | セッション認証 | JWT認証 |
---|---|---|
状態管理 | サーバー側でセッション保持 | ステートレス(サーバーで状態を持たない) |
適した場面 | 一体型アプリ、社内システムなど | API連携、モバイル、SPAなど |
スケーラビリティ | 負荷分散が難しい | 負荷分散しやすい |
セキュリティ | CSRFの対策が必要 | トークンの盗難に注意 |
5. セキュリティ対策:CSRF・トークン失効処理
● CSRF(セッションで特に重要)
Spring Securityのcsrf().disable()
は安易に使わないように!
セッション認証ではCSRFトークンの送信と検証が重要です。
● JWTの失効管理
JWTはステートレスなため、基本的に失効できません。
代替案としては
- トークンの有効期限を短くする
- リフレッシュトークンを使う
- Redisなどでブラックリスト管理
6. 実務での選び方とベストプラクティス
要件 | 推奨認証方式 |
---|---|
Webアプリ(画面遷移あり) | セッション認証 |
SPA + API構成 | JWT認証 |
マイクロサービス連携 | JWT(+ OAuth2) |
実務ではフロントの構成や認証サーバーの独立性、スケーラビリティの要件を考慮して選びましょう。
7. まとめ
- Java × Spring Bootでは、セッションとJWTの両方に対応可能
- セッション認証は従来型アプリに最適
- JWTはAPI・SPAに最適で、スケーラビリティにも強い
- セキュリティ面では、それぞれ対策が異なるため要注意!
おすすめ記事リンク
✅ 【Java入門】Seleniumでブラウザ操作を自動化する方法
✅ 【保存版】JavaとMySQLで社内データ管理システムを構築する方法
✅ 【年収1,000万円も狙える!?】ハイクラス転職でキャリアを加速させる方法