개발자

refresh Token은 왜 사용하는건가요??

2023년 11월 25일조회 1,005

액세스 토큰이 탈취될 가능성이 있어서, 탈취된 경우 피해를 최소화하기 위해 리프레쉬 토큰을 사용한다고 이해했습니다. 액세스 토큰만을 사용하고, 액세스 토큰을 브라우저의 쿠키에 저장한다고 했을때 쿠키에 httponly, secure 설정 / 서버에 csrf토큰 및 https를 적용하면 Csrf 및 Xss 공격을 예방하고 쿠키에 저장된 액세스 토큰이 암호화 되어 있어 이를 가로챈다고 해도 원래 값을 알아낼 수 없으니 액세스 토큰 자체가 탈취될 가능성을 배제할 수 있을 것 같은데 어떤 이유에서 리프레쉬 토큰을 쓰는건가요??? 정말 너무 너무 궁금한데 지식이 부족해 구글링으로 속시원한 답을 찾아낼 수 없어 질문 올려봅니다..!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

김하림님의 프로필 사진

사용자 편의를 위해서라고 보시면 될 거 같아요. 액세스 토큰이 만료되면 사용자 로그인이 풀리고, 다시 로그인을 해야 되는 상황이 오는데, 사용자 입장에서는 번거롭죠. 특히 보안을 신경 쓴다고 액세스 토큰 만료 기간을 짧게 하면 사용자가 로그인 하는 횟수가 더 늘어나는데, 이렇게 되면 사용자 경험에도 안 좋고 이탈률도 높아질거에요. '토큰이 만료되면 서버에 보내서 새 걸로 바꿔달라고 하면 되지 않나?' 라고 생각하실 수 있는데, 그럼 사실상 토큰의 보안성이 무용지물이 되죠. 이 때 토큰과 별개로 리프레시 토큰이라는 개념이 생겨나고, 리프레시 토큰을 서버로 보내면 서버가 정상적인 리프레시 토큰인지를 확인하고 새 토큰을 응답으로 내려주게 된거에요. (리프레시 토큰은 보통 만료 기간을 엄청 길게 잡습니다) 이렇게 하면 보안을 위해 액세스 토큰의 만료 시간을 짧게 잡아도 리프레시 토큰이 커버를 해주기 때문에 보안도 챙기고, 사용자는 딱히 뭘 안해도 자동으로 토큰이 갱신되니 매번 로그인해야 하는 번거로움이 줄어들죠. 그럼 또 '리프레시 토큰도 탈취당하면 그만 아닌가?'라고 생각하실 수 있는데, 맞습니다. 그래서 리프레시 토큰은 서버에서 비정상적인 활동이 없었는지 (평소에 한국 IP 주소를 사용하던 사용자가 중국 IP로 리프레시 토큰을 발급받는다던지) 엄격한 검증을 해서 보안을 강화하는 작업이 필요합니다. 그럼 여기서 또 들 수 있는 생각이, '그냥 리프레시 토큰 없이 만료된 토큰을 서버에 보내고, 서버에서 비정상적인 활동이 없으면 새 토큰을 발급해주면 되는거 아닌가?' 라고 생각하실 수 있을텐데요. 이렇게 되면 언제든지 만료된 토큰을 가지고 리프레시를 받을 수 있기 때문에 다시 보안성이 저하되는 문제가 생깁니다. 결국 다시 리프레시 토큰이 필요하게 됩니다. 결론적으로, "리프레시 토큰은 보안과 사용자의 편의성 두 마리 토끼를 잡기 위해 생겨났다"로 정리가 가능합니다.

profile picture

익명

작성자

2023년 11월 27일

우선 답변 감사합니다! 추가적으로 궁금한 점이 있어 질문 드립니다. 일반적으로 액세스 토큰의 유효 기간을 짧게 잡는 이유가 토큰 탈취 가능성 때문이고, 이를 보완하기 위한 장치가 리프레쉬 토큰인데 Https를 적용하고 쿠키에 secure 옵션을 활성화 하여 액세스 토큰을 저장하면 탈취될 위험이 거의 없을 것이라고 예상되는데 이 경우, 리프레쉬 토큰의 통상적인 만료 기간인 2주 정도로 액세스 토큰의 만료 기간을 설정한다면 매번 로그인 해야하는 번거로움도 줄이고, 추가적으로 토큰으로 액세스 토큰을 발급받는 것이 아니라 재 로그인을 요구하는 것이기 때문에 보안도 챙길 수 있지 않을까요?? 리프레쉬 토큰을 사용하는 이유가 아직 와닿지 않아 이렇게 다시 질문 드립니다! 감사합니다.

김하림님의 프로필 사진

김하림

우아한형제들 프론트엔드 개발자2023년 11월 28일

저도 말씀하신 것처럼 액세스 토큰이 탈취될 위험은 "거의" 없다고 생각합니다. 하지만 "거의" 일어나지 않은 일이 일어났다고 생각해봅시다. 이 때, 공격자 입장에서 토큰 만료 시간이 5분인 것과 2주인 것 중 어느 쪽이 더 공격하기 쉬울까요? 당연히 후자입니다. 2주라는 시간은 공격자가 공격하기에 충분한 시간입니다. 또한 리프레시 토큰 없이 액세스 토큰만 사용한다고 하면, 탈취가 일어났을 때 대응 수단이 없습니다. 아시다시피 JWT 토큰은 한 번 발급되면 세션과 다르게 취소시킬 방법이 없기 때문에, 서버에서 이상 징후를 감지하더라도 막을 방법이 없습니다. 리프레시 토큰은 액세스 토큰과 다르게 세션처럼 DB에 저장해서 언제든지 취소시키는 방식으로 구현하더라도 서버에 부담이 없기 때문에 (새 액세스 토큰을 발급받을때만 사용하니까) 이상 징후 감지 시 토큰을 만료시켜버릴수도 있고, 비용과 성능 측면에서도 의미가 있습니다. 결론적으로, 보안상 리스크를 조금이라도 더 줄이고 싶다면 리프레시 토큰 사용을 고려하고 그게 아니라면 (ex: 사용자가 얼마 없고 탈취되어도 큰 일날 정도는 없는 서비스를 운영하는 경우 등) 액세스 토큰을 사용해도 무방합니다.

profile picture

익명

작성자

2023년 11월 28일

명료한 답변 감사합니다! 자세히 설명해주셔서 드디어 이해할 수 있었어요 무조건 리프레쉬 토큰을 써야하는 것처럼 설명하는 글이 많아서 Https 사용시에도 꼭 써야하는건지 궁금했는데 서비스 상황에 따라 보안성을 높이기 위해 고려하는 요소인거군요 다시 한번 감사드립니다!!🙇🏻‍♀️

이상선님의 프로필 사진

리프레쉬 하려고 사용해요. 저세히 알고 싶으면 채팅요

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!