Skip to content

[이슈] 리프레시 토큰 저장방식 변경

MoonMinHyuk1 edited this page Apr 25, 2023 · 1 revision

기존방식

  • 유저 로그인 시 JWT형태의 액세스 토큰과 리프레시 토큰을 생성해 관리합니다.
  • 프로젝트 초기에, 프론트엔드에서는 액세스 토큰과 리프레시 토큰 모두 클라이언트의 로컬 스토리지에서 관리했고,
    백엔드에서는 redis 서버에 리프레시 토큰을 저장해 관리했습니다.
  • redis에는 유저 아이디가 key, 리프레시 토큰이 value 형태로 저장되었습니다.

변경이유

  • 유효기간이 긴 리프레시 토큰이 로컬 스토리지에 저장되면 XSS(Cross Site Scripting)공격 등으로 탈취를 당할 위험이 있다고 판단했습니다.
  • 따라서, 로컬 스토리지와 redis를 사용해 관리하던 리프레시 토큰을 쿠키에 담아 저장하는 방식으로 변경하기로 했습니다.

변경과정

스크린샷 2023-04-26 오전 2 12 24
쿠키를 사용하는 것도 안전한 방법이라고 할 수 없습니다.
보안의 위험성을 방지하기 위해 우선, 자바스크립트에서 접근이 불가능하도록 HTTP Only 옵션을 걸어주었습니다. 또한, HTTPS 암호화를 사용해 secure 옵션도 걸어주었습니다.
그럼에도, 쿠키를 사용하면 CSRF(Cross-Site Request Forgery)공격에 취약합니다.
하지만, 리프레시 토큰은 토큰 재발급 요청외에 인증, 인가가 필요한 요청에는 접근할 수 없기 때문에 괜찮다는 판단을 내렸습니다.
결론적으로, 리프레시 토큰을 로컬 스토리지 대신 쿠키에 저장해 관리하는 방식으로 변경했습니다.
Clone this wiki locally