[JWT]Refresh Tokenクライアント情報の保存


今日は、JWTを保存し、クライアント情報に基づいてデータベースに保存してみましょう.
🔍目次
  • なぜ
  • が実施されたのか
  • クライアント情報
  • を取得する.
  • クライアント情報に従ってResfreshトークン
  • を保存する.
  • テスト
  • 📌なぜ実施しますか?
    実施の理由は、Restful APIを実施する際に、クライアントのRefresh Tokenを区別しなければならないからである.ユーザーは、Web、モバイル、その他のデバイスなどでサービスに接続できるため、ユーザーの1つのアカウントに応じて複数のトークンを発行する必要があります.以前に実装された内容は,各アカウントに1つのRefresh Tokenしか発行されなかった.
    私が望んでいる.
  • などのエージェントが必要な場合は、Refreshコインを繰り返し発行することはできません.
  • エージェントのリフレッシュトークンはDBに格納されるべきである.
  • 📌クライアント情報の取得
    ブランチの作成
    まず、この機能を実現するためにブランチを作成します.
    git flow feature start JwtClient
    
    git checkout JwtClient
    リクエスト分析
    まずRequestに送信するクライアント情報を調べてみましょう.
    テストコントローラの作成
    
    @GetMapping("/jwtTest")
        public String jwtTest(@RequestHeader("User-Agent") String userAgent){
            log.info("UserAgent = {}", userAgent);
    
            return userAgent;
        }
    
    まずGetにマッピングし、Header値の「User-Agent」値を取得します.
    そして色々な価格で申し込みましょう.
  • PostMan要求
  • Mac-Chromeリクエスト
  • 移動要求
  • これはpcのローカル操作なので、私も知りません.ははは
    これで、別のRefresh Tokenがユーザーエージェントによって保存されます.
    📌クライアント情報に基づいてRefresh Tokenを保存
    そのためにやるべきことがある.
    1.「User-Agent」の値を取得する
    2.「User-Agent」の値を区切る
    3.区切り文字列をデータベースに保存する
    「User-Agent」値の取得
    面接を受けましたが、正式にコードに適用しましょう.
    前の記事に示すように、「/login」urlにトークンが発行されます.それを直してください.
    UserController.Javaコードの変更
    // 로그인
        @PostMapping("/login")
        public Token login(@RequestBody Map<String, String> user, @RequestHeader("User-Agent") String userAgent) {
            log.info("user email = {}", user.get("userEmail"));
            User member = userRepository.findByUserEmail(user.get("userEmail"))
                    .orElseThrow(() -> new IllegalArgumentException("가입되지 않은 E-MAIL 입니다."));
           // return jwtService.login(member);
            Token tokenDto = jwtTokenProvider.createAccessToken(member.getUsername(), member.getRoles());
           
           // 여기서 user agent를 넘겨주어야함
            jwtService.login(tokenDto, userAgent);
            return tokenDto;
        }

  • 「User-Agent」をいただきました.

  • 「userService」でrefresh tokenを検証し、サービスに値を渡します.
  • 「User-Agnet」値の区別
    この内容は、データベースにプロキシ値が格納されているかどうかを確認します.
    RefreshTokenRepository.java
    タグ内のエージェントの情報を検証するためにjpaメソッドを作成する必要があります.
    public interface RefreshTokenRepository extends JpaRepository<RefreshToken, Long> {
       Optional<RefreshToken> findByRefreshToken(String refreshToken);
       
       //생성
       boolean existsByKeyEmailAndUserAgent(String userEmail, String userAgent);
       
       //생성
       void deleteByKeyEmailAndUserAgent(String userEmail, String userAgent);
    }
    RefreshToken.java
    トークンドメインも変更する必要があります.トークンドメインにはプロキシ値が必要です.
    public class RefreshToken {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "REFRESH_TOKEN_ID", nullable = false)
        private Long refreshTokenId;
    
        @Column(name = "REFRESH_TOKEN", nullable = false)
        private String refreshToken;
    
        @Column(name = "KEY_EMAIL", nullable = false)
        private String keyEmail;
    
        @Column(name ="USER_AGENT", nullable = false)
        private String userAgent;
    
    }
    UserService.java
    次に、実装された内容に基づいてサービスでチェックしてみましょう.
    
    @Transactional
        public void login(Token tokenDto, String userAgent){
    
            RefreshToken refreshToken = RefreshToken.builder().keyEmail(tokenDto.getKey()).refreshToken(tokenDto.getRefreshToken()).build();
            String loginUserEmail = refreshToken.getKeyEmail();
            //여기서 refresh Token과 해당 agent로 저장되어있는지 확인을 해야한다.
            if(refreshTokenRepository.existsByKeyEmailAndUserAgent(loginUserEmail, userAgent)){
                log.info("기존의 존재하는 refresh 토큰 삭제");
                refreshTokenRepository.deleteByKeyEmailAndUserAgent(loginUserEmail, userAgent);
            }
            refreshTokenRepository.save(refreshToken);
    
        }
    保存されている場合は、削除して再保存します.
    保存されていない場合は、すぐに保存します.
    📌テスト
    Postmanでテストしてみます.
  • agent - postman
  • agnet - chrome

  • 両方のリクエストは正しい応答を得た.データベースには、プロキシベースのRefresh Tokenを2つ保存する必要があります.

    成功!
    sequence idが2.4の理由は、同じリクエストが複数回クリックされたためです.
    今はネクタイにリボンを置くことができます.