"Refresh Token(리프레시 토큰)"은 OAuth 2.0 프로토콜에서 사용되는 보안 관련 개념 중 하나입니다. 주로 웹 애플리케이션 또는 모바일 애플리케이션과 같은 클라이언트가 서버로부터 인증 및 액세스 토큰을 요청할 때 사용됩니다. 이 토큰은 보통 액세스 토큰의 유효기간이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용됩니다.
리프레시 토큰의 역할
- 액세스 토큰 갱신: 리프레시 토큰을 사용하여 만료된 액세스 토큰을 새로 발급받을 수 있습니다.
- 사용자 인증: 클라이언트가 서버로부터 새로운 액세스 토큰을 요청할 때, 사용자의 인증 상태를 확인합니다.
- 보안 강화: 리프레시 토큰은 짧은 유효기간을 가지지 않아서, 만약 리프레시 토큰이 유출되더라도 공격자가 액세스를 계속해서 요청하는 것을 방지할 수 있습니다.
리프레시 토큰의 작동 방식
- 클라이언트는 인증된 상태에서 서버로부터 리프레시 토큰을 받습니다.
- 액세스 토큰이 만료되면 클라이언트는 리프레시 토큰을 사용하여 서버에 새로운 액세스 토큰을 요청합니다.
- 서버는 유효한 리프레시 토큰을 받으면 새로운 액세스 토큰을 발급하고 응답합니다.
- 클라이언트는 새로운 액세스 토큰을 사용하여 보호된 리소스에 접근합니다.
- 이 과정을 반복하여 보안을 유지하고 유효기간이 만료된 액세스 토큰을 신속하게 갱신합니다.
주의할 점
- 리프레시 토큰은 보안 상 주요 정보이므로 안전하게 저장되어야 합니다.
- 리프레시 토큰을 서버에 저장하거나 다른 보안 기술을 사용하여 안전하게 관리해야 합니다.
- 액세스 토큰과 리프레시 토큰을 함께 사용할 때, 서버에서는 유출된 토큰을 재사용하지 않도록 조심해야 합니다.
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;
}
}
}