【現場で使える】Java×Spring Bootで認証機能を実装する方法|JWT・セッション管理を徹底解説

導入:その認証、古くないですか?

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が自動管理してくれます。

    ● 実装ステップ

    1. 依存ライブラリ(spring-boot-starter-security)を追加
    2. WebSecurityConfigurerAdapterを継承して設定
    3. ログイン用の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 トークンとして送信

    ● 実装ステップ

    1. JWTライブラリの導入(例:jjwt
    2. 認証処理でJWTの発行・検証ロジック追加
    3. 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万円も狙える!?】ハイクラス転職でキャリアを加速させる方法

    タイトルとURLをコピーしました