본문 바로가기

Study/개발일지

[백엔드스터디WIL] Refresh Token을 쓰는 이유 (13주차)

Refresh Token을 사용하는 이유

access token은 발급된 이후, 서버에 저장되지 않고 토큰 자체로 검정을 하며 사용자 권한을 인증한다는 stateless(무상태)라는 특징이 있는데요.

때문에 access token이 탈취되면 토큰이 만료되기 전까지 토큰을 가진 사람은 누구나 권한 인증이 가능해진다는 문제점이 발생할 수 있으며, 이러한 문자점을 보완하기 위해서 액세스 토큰의 만료 기간을 짧게 주는 방식이 적용되고 있습니다.

 

설정하기에 따라 다르지만 일반적으로 access token의 유효 기간은 30분에서 1시간 정도로 발급되며, 유효 기간이 짧은 만큼 사용자의 측면에서는 토큰이 만료될 때마다 다시 로그인을 하여 액세스 토큰을 발급받아야 하는 불편함이 생기게 됩니다.

 

이러한 이유 때문에 refresh token이 사용되게 되었는데요.

refresh token은 access token에 비해 훨씬 더 긴 유효 기간으로 발급되며, 리프레시 토큰의 경우 접근에 대한 권한을 가진 것이 아니라 액세스 토큰 재발급에만 사용된다는 특징이 있습니다.

 

/*

정리하자면, access token의 안전성을 확보하기 위해 유효 기간을 짧게 잡았고, 이때 생기는 사용자의 편의성 감소로 보완하기 위해 refresh token이 사용되게 되었습니다.

액세스 토큰과 리프레시 토큰은 보안성과 성능 그리고 사용 편의성 등을 적절하게 타협한 결과로 볼 수 있습니다.

*/

 

 

Refresh Token의 문제점과 추가적인 보안 방안

하지만 리프레시 토큰에도 문제점은 있는데요. stateless라는 특징으로 인해 액세스 토큰과 마찬가지로 탈취 당할 위험이 있으며, 탈취 되었을 때 refresh token을 통해 access token을 재발급 받을 수 있게 됩니다.

 

때문에 최초 로그인 시, 로그인 요청 ip를 저장하고 재발급 요청이 왔을 때, 요청이 온 ip와 저장된 ip를 비교하여 다른 경우 토큰을 재발급하지 않거나 알림을 보내는 등의 조치를 취할 수 있는데요.

아래 예시 내용은 로그인 시 redis를 사용하여 리프레시 토큰을 저장하고, 이때 요청이 들어온 ip 주소도 함께 저장하여 추후 토큰 재발급 요청이 왔을 때 ip를 비교하는 방식을 사용하였습니다.

 

 


구현 코드

해당 내용은 security + jwt 로그인에 대한 기본적인 구현 이후의 내용으로 로그인 방식에 대한 전반적인 이해가 필요한 내용입니다. 

security + jwt 로그인 방식에 대한 자세한 내용이 필요하시다면 아래 포스팅을 먼저 참고하시면 좋을 것 같습니다.

 

2021.09.22 - [Programming/Spring Boot] - spring security + JWT 로그인 기능 파헤치기 - 1

 

/*

전체 코드 및 부분적으로 사용된 method를 모두 설명하기에는 내용이 너무 길어지기 때문에 전체적인 로직을 위주로 설명되었으며, 부족한 부분은 포스팅 맨 하단 참고 자료 및 github의 소스 코드를 함께 보시면 좋을 것 같습니다.

*/

 

 

1. RefreshToken Class

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
@RedisHash(value = "refresh", timeToLive = 604800)
public class RefreshToken {

    private String id;

    private String ip;

    private Collection<? extends GrantedAuthority> authorities;

    @Indexed
    private String refreshToken;
}

redis에 저장될 RefreshToken 클래스입니다.

 

저장되는 클래스의 내용을 살펴보면, access token 재발급에 사용될 id 및 authorities 정보 및 refresh token에 대한 정보가 저장되고 있으며, ip 정보도 함께 저장되는 것을 볼 수 있는데요.

최초 로그인 시 refresh token과 함께 ip 정보를 저장하여 토큰 재발급 요청 시, 최초 로그인 된 ip 주소와 비교를 통해 재발급 여부를 결정하는 방식을 적용하기 위함입니다.

 

728x90