카테고리 없음

#27 Refresh Token

kmsoon 2024. 6. 10. 14:16

"Refresh Token(리프레시 토큰)"은 OAuth 2.0 프로토콜에서 사용되는 보안 관련 개념 중 하나입니다. 주로 웹 애플리케이션 또는 모바일 애플리케이션과 같은 클라이언트가 서버로부터 인증 및 액세스 토큰을 요청할 때 사용됩니다. 이 토큰은 보통 액세스 토큰의 유효기간이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용됩니다.

 

 

리프레시 토큰의 역할

  1. 액세스 토큰 갱신: 리프레시 토큰을 사용하여 만료된 액세스 토큰을 새로 발급받을 수 있습니다.
  2. 사용자 인증: 클라이언트가 서버로부터 새로운 액세스 토큰을 요청할 때, 사용자의 인증 상태를 확인합니다.
  3. 보안 강화: 리프레시 토큰은 짧은 유효기간을 가지지 않아서, 만약 리프레시 토큰이 유출되더라도 공격자가 액세스를 계속해서 요청하는 것을 방지할 수 있습니다.

 

 

 

리프레시 토큰의 작동 방식

  1. 클라이언트는 인증된 상태에서 서버로부터 리프레시 토큰을 받습니다.
  2. 액세스 토큰이 만료되면 클라이언트는 리프레시 토큰을 사용하여 서버에 새로운 액세스 토큰을 요청합니다.
  3. 서버는 유효한 리프레시 토큰을 받으면 새로운 액세스 토큰을 발급하고 응답합니다.
  4. 클라이언트는 새로운 액세스 토큰을 사용하여 보호된 리소스에 접근합니다.
  5. 이 과정을 반복하여 보안을 유지하고 유효기간이 만료된 액세스 토큰을 신속하게 갱신합니다.

 

 

 

주의할 점

  • 리프레시 토큰은 보안 상 주요 정보이므로 안전하게 저장되어야 합니다.
  • 리프레시 토큰을 서버에 저장하거나 다른 보안 기술을 사용하여 안전하게 관리해야 합니다.
  • 액세스 토큰과 리프레시 토큰을 함께 사용할 때, 서버에서는 유출된 토큰을 재사용하지 않도록 조심해야 합니다.

 

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtTokenUtil {

    private static final long ACCESS_TOKEN_EXPIRATION_TIME = 900000; // 15 minutes
    private static final long REFRESH_TOKEN_EXPIRATION_TIME = 1800000; // 30 minutes
    private static final String SECRET_KEY = "YourSecretKey";

    public static String generateAccessToken(String username) {
        return Jwts.builder()
                   .setSubject(username)
                   .setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION_TIME))
                   .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                   .compact();
    }

    public static String generateRefreshToken(String username) {
        return Jwts.builder()
                   .setSubject(username)
                   .setExpiration(new Date(System.currentTimeMillis() + REFRESH_TOKEN_EXPIRATION_TIME))
                   .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                   .compact();
    }

    public static String getUsernameFromToken(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
    }

    public static boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}