인프런 커뮤니티 질문&답변

khmin3011님의 프로필 이미지
khmin3011

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

AccessTokenGuard 적용해보기

리프레시 토큰 관련 질문이 있습니다.

작성

·

497

0

안녕하세요.

해당 강의에 대한 질문이라기 보다 현재 우리가 구현한 인증/인가 구현 방법에 대한 질문이 있습니다.

 

accessToken은 만료되었을 시 refreshToken을 재발급 받을 수 있도록 우리가 API를 만들었습니다.

 

따라서 클라이언트 측에서 accessToken 만료 시 refreshToken을 재발급하는 API를 요청하고 갱신을 할 것이라고 생각됩니다.

 

하지만 refreshToken을 갱신하는 API는 refreshToken이 만료되었을 시에는 리프레쉬 토큰을 갱신하지 못합니다. 이 때 사용자에게 재로그인을 시킨다는 기획이라면 문제가 없을 것 같습니다. (재로그인이라면 리프레시 토큰 갱신 API는 불필요할 것으로 생각됩니다.)

 

그렇다면 리프레시 토큰을 갱신하는 API는 클라이언트 입장에서 언제 호출을 해야되나요?

사용자가 우리 서비스를 이용한다면 주기적으로 리프레시 토큰을 갱신하는 API를 호출하고 리프레시 토큰을 갱신을 해놔야하나요?

 

정답이야 없겠지만 스탠다드한 방법이 궁금합니다!

답변 1

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

말씀하신대로 정답은 없습니다.

이미 가장 중요한 방법은 잘 파악 하셨습니다.

만료되면 그냥 다시 로그인을 시키는 방법이 가장 '무식한(?)' 방법이지만 간단하고 편합니다. UX를 희생해야 한다는 단점이 있지만요.

제가 아는 굉장히 큰 기업에서는 refresh token 만료 기간이 없는 경우도 있습니다. 황당하게 생각 할 수 있지만 단 한번도 문제가 된적은 없다고 하네요.

또다른 방법은 요청을 할때 (access token을 사용하는 요청) refresh token의 만료기간을 확인하고 (signature 검증이 없어도 JWT의 내용은 확인 할 수 있습니다. 그리고 이 문맥에서는 만료기간 정보를 신뢰하지 못해도 아무 상관이 없습니다) refresh token의 만료 기간이 지정한 시간보다 적게 남은 경우 refresh token 재발급 요청을 같이 보내는 방법입니다. 이 경우 꼭 기존 refresh token을 invalidate 시켜야합니다. 흔히 레디스를 사용해서 만료 기간까지 만료된 토큰 정보를 들고 있습니다.

위 방법을 조금 변형하면 요청할때가 아니라 프론트엔드의 백그라운드 프로세스에서 지속적으로 refresh token을 확인한 후 적절한 시기에 재발급 받는 방법이 있습니다.

물론 위 두 방법은 서비스가 '실행중' 또는 '백그라운드 실행중'이어야 가능한 상황입니다. 오랫동안 서비스를 실행하지 않았다면 재발급은 사실상 불가능합니다.

완벽한 방법은 없습니다. refresh token 탈취 시나리오를 생각하는 순간 사실상 어떤 방법도 의미가 없어지기 때문이죠.

감사합니다!

khmin3011님의 프로필 이미지
khmin3011
질문자

이해했습니다! 상세한 답변 감사합니다.
토큰의 만료시간을 클라이언트에서도 확인할 수 있다는 사실을 몰라서 질문을 했던 것 같습니다.
덕분에 새로운 사실을 알게 됐습니다!
감사합니다!

khmin3011님의 프로필 이미지
khmin3011

작성한 질문수

질문하기