📌 들어가며
지난 포스팅에서는 access token 과 session 에 대해서 알아 보았습니다. 이번 포스팅에서는 refresh token에 대해서 알아보고자 합니다. 사실 refresh token에 대해 알아보고자 했던 이유는 얼마 전 같은 팀원 분이 경력직 면접의 면접관으로 들어갔는데 지원자분께 refresh token에 대해 물었더니 제대로 설명을 못해서 충격적이었다 라는 말을 듣게 되어서 였습니다. 비록 현재는 인증과 인가와 관련된 개발을 하고 있지 않지만 인증과 인가는 백엔드 개발자라면 반드시 알아야 하는 개념이라고 생각합니다.
📌 Refresh Token은 왜 사용할까?
Refresh Token을 사용하는 가장 큰 이유 중 하나는 보안문제 입니다. 토큰을 서버에서 관리하지 않기 때문에 서버는 한 번 발급해준 토큰에 대해서 제어권을 가지고 있지 않습니다. 따라서 만약 해커에게 유효한 토큰을 탈취당하게 되면 해당 토큰이 만료되기 전까지 서버는 속수무책으로 당할 수 밖에 없게 됩니다.
📌 Refresh Token 이란?
Refresh Token은 Access Token의 유효 기간을 짧고, 자주 재발급 하도록 만들어 보안을 강화하면서도 사용자에게 잦은 로그아웃 경험을 주지 않도록 하는 것입니다. Access Token이 서버의 리소스에 접근하기 위해서 사용되는 토큰이라면, Refresh Token은 기존에 클라이언트측에서 가지고 있던 Access Token이 만료되었을 때 Access Token을 새로 발급받기 위해 사용한다.(유효기간의 연장X)
일반적으로 Refresh Token은 Access Token 대비 긴 유효 기간을 갖습니다. Refresh Token을 사용하는 상황에서는 Access Token의 유효기간은 30분 이내(저희 회사는 20분으로 설정되어 있습니다.) Refresh Token의 유효기간은 2주 정도로 설정한다고 한다. 당연히 서비스 성격에 따라 적절한 유효기간을 설정 해야한다.
📌 Refresh Token 프로세스
- 클라이언트에서 로그인을 요청하고 인증에 성공하면 서버는 Access Token 과 Refresh Token을 함께 제공한다.
- 이후 클라이언트는 서버의 리소스에 접근하기 위한 요청에 Access Token을 실어 보낸다.
- 시간이 흘러 Access Token이 만료 되면 클라이언트는 Refresh Token을 서버로 전달하여 새로운 Access Token을 발급받는다.
📌 Refresh Token의 종류
그렇다면 Refresh Token의 종류에는 어떠한 것들이 있을까?
Refresh Token으로 사용될 수 있는 것은 대표적으로 많이 사용되는 JWT 이거나 혹은 문자열 혹은 UUID 가 될 수 있습니다.
JWT
Refresh Token이 만약 JWT 라면, Access Token과 똑같이 stateless 하고, 토큰 자체에 데이터를 담을 수 있습니다. 이 경우 Refresh Token의 유효성을 검증하기 위해 데이터베이스에 별도로 액세스하지 않아도 된다는 이득이 있습니다. 따라서 서버의 부하가 상대적으로 적습니다. 하지만 Access Token과 마찬가지로 Refresh Token 을 서버에서 제어할 수 없다는 것이 단점이 될 수 있습니다. 즉, Refresh Token 을 탈취당한 상황에서 토큰을 별달리 무효화 시키는 방법이 없습니다.
JWT 형태가 아닌 Refresh Token
Refresh Token으로 random string 또는 UUID 등으로 사용한다면, 그 토큰을 사용자와 매핑되도록 데이터베이스에 저장해야합니다. 이런 경우 Refresh Token 사용시마다 유효한 Refresh Token인지 확인하기 위해 데이터베이스에 액세스 해야한다. 하지만, 사용자를 강제로 로그아웃 시키거나, 차단할 수 있게됩니다. 또한 Refresh Token이 탈취되었을 경우 그 즉시 무효화시킬 수 있습니다.
RTR (Refresh Token Rotation)
RTR은 Refresh Token을 한번만 사용할 수 있게(One Time Use Only) 만드는 방법입니다. Refresh Token을 사용하여 새로운 Access Token을 발급받을 때 Refresh Token 도 새롭게 발급받게 하여 기존의 Refresh Token은 사용하지 않게 됩니다. 이런 방식을 사용하면, 이미 사용된 Refresh Token을 사용하게 되면 서비스측에서 탈취를 확인하여 조치할 수 있게 됩니다. 다만, 사용되지 않은 Refresh Token을 훔쳐 사용하거나, 그냥 지속적으로 Access Token만을 탈취한다면 막을 수 없습니다.
📌 마치며
Refresh Token을 사용하여 Access Token의 보안성을 높일 수는 있지만 토큰 방식이 갖는 stateless 한 특성 때문에 어떠한 방식으로든 토큰을 탈취당하게 되면 보안상 큰 문제가 발생할 수 있습니다. 따라서 토큰을 갖고 있는 클라이언트 측에서 XSS, CSRF 등의 공격으로부터 Refresh Token이 탈취되지 않도록 안전하게 보관해야 합니다.
'개발은 개념싸움이야🫠' 카테고리의 다른 글
[DB] 트랜잭션(transaction) 과 격리성 수준 (2) | 2023.10.23 |
---|---|
CQRS 란 무엇인가 (0) | 2023.03.11 |
Session 과 Token 방식을 활용한 '인증'과 '인가'란? (0) | 2023.02.11 |
객체란 무엇인가 - 객체(object), 클래스(class) , 인스턴스(instance) (1) | 2023.02.02 |