실무 처럼! JWT 로그인 3(Access Token,Refresh Token,토큰 생성)

요한·2025년 5월 24일

실무처럼!

목록 보기
4/5

JWT 설명은 링크 옆에 있습니다! jwt 설명

Token 관리

로그인할때 JWT 토큰은 2가지로 AccessTokenRefreshToken 크게 두가지로 분류한다.

Client 와 Server 흐름 중요!

AccessToken

clinet에 저장되어 server로 보내서 권한 및 정보(사용자 정보, 만료시간,서명)를 확인

  • 만료 시간이 짧다.
  • DB에 저장하지 않는다
  • clinet가 저장한다.

RefreshToken

AccessToken이 기간이 짧아서 만약 다시 로그인을 할 번거러움이 있다. 예)30분으로 잡으면 다시 여기서 RefreshToken을 사용해서 다시 로그인을 하지 않아도 AccessToken 을 재발급 할 수있게 한다.
DB에 저장할때 user에 대한 식별자와 만료 시간을 저장하면된다!

  • 만료 시간이 길다.
  • DB에 저장한다
  • DB에 만료 시간을 함께 저장한다.

실무 RefrshToken 저장 정보

보안을 위해 user의 PK값 뿐만아니라 UUID OR JWT도 함께 저장한다고 한다!

코드설명

JwtUtil.java

    @Value("${token.secret.key}")
    private String secretKey;
    
    public SecretKey getSecretKey() {
        return Keys.hmacShaKeyFor(secretKey.getBytes());
    }

앞서 gitignore 했던부분에 properties부분에 token.secret.key 으로 했고
서명키에 필요한 부분이고 jjwt 라이브러리 사용할때 서명부분에 첫번째 파라미터에 Key객체를 사용하라고 하네요. 그래서! getSecretKey 부분에 return 을 Key 객체를 해주었습니다! 이부분은 나중에 더욱 자세히 공부할예정입니다

    //token 생성
    public String createToken(String email, String role){
        String roleResult = role.substring(1, role.length()-1);
        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setSubject(email) // 고유 식별할 수있는내용
                .claim("role", role) // 권한 부여
                .setIssuedAt(new Date()) // 발급 시간
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 30))// 발금시간 30분
                .signWith(getSecretKey(), SignatureAlgorithm.HS256)
                .compact();
    }

사용자 정보에는 일단 권한만 넣었습니다! 식별자 사용하는 이메일
그리고 권한이 [ADMIN] 이렇게 들어가서 수정 작업도 한줄했습니다.
발급 시간은 현재 시간이고 만료시간은 30분으로 했습니다. 이것도 properties에 보관한다고도 하네요 이렇게 작성하면 문자열로 작성된 JWT 생성!

    public String getUserEmail(String token){
        return Jwts.parserBuilder()
                .setSigningKey(getSecretKey())
                .build()
                .parseClaimsJwt(token)
                .getBody()
                .getSubject(); // subject 식별이름
    }

JWT생성했으면 생성된 token을 가지고 파싱도 해야 사용자 정보를 확인 할수있다.
서명키를 가져와 확인하고 build()까지가 객체 빌드 (JwtParser 반환!) 이후 token을 가져와 body 부분에 subject 위에 식별자를 반환한다.

결과


JWT를 잘 받아온것을 알수 있습니다!

만료 토큰 반환방법이나 reflesh Token을 가지고 만료된시점을 구별해서 Security + JWT를 사용해서 로그인 처리 및 토큰 만료 처리를 하겠습니다!

긴글 읽어 주셔서 감사합니다! :)

profile
코드 깍는 개발자 kangyohan.dev.0421@gmail.com

0개의 댓글