하나씩 정리하는 중
access token은 탈취 시 위험하니 access token 만료 기간을 짧게 하자!
→ 그런데 access token가 1시간이라 1시간마다 로그아웃 된다면...? 유저가 엄청 불편하다
→ 그럼 refresh token이라는 것을 줘서 access token 의 기간을 짧게 잡되, refresh token이 있으면 access token을 재발급하자! 유저가 필요할 때마다 access token을 알아서 재발급하면 해결.
⭐ access token 탈취 이후 정보 유출을 근본적으로 막을 수 없지만 하나의 방어책+유저 편의성을 위해 refresh token을 사용할 수 있는 것
access token을 재발급하기 위한 API 요청을 줄일 수 있다. 그러나 프론트에서 token을 관리하면서 발생할 수 있는 서버 이슈를 모두 감당하기 어려울 수 있다.
local storage 는 자바스크립트로 접근이 너무 쉬워서 XSS 공격에 취약하고 보안상 문제 소지가 많다.
XSS 공격
크로스 사이트 스크립팅(Cross Site Scripting, XSS).
공격자가 상대방의 브라우저에 스크립트가 실행되도록 해 사용자의 세션을 가로채거나, 웹사이트를 변조하거나, 악의적 콘텐츠를 삽입하거나, 피싱 공격을 진행하는 것
HTTPOnly 와 Secure 옵션을 사용하고 CSRF 공격에 대비를 하면 어느정도 보안을 할 수 있다.
CSRF 공격
원클릭 공격 또는 세션 라이딩(Cross-Site Request Forgery).
CSRF는 링크 또는 스크립트를 사용하여 사용자가 인증된 대상 사이트로 원하지 않는 HTTP 요청을 전송.
서버 issue를 백엔드에서 관리하기 용이하다. 반대로 access token을 재발급하기 위한 API 요청이 많아질 수 있다.
세션에 저장하고 세션 만료 주기를 늘리는 방식. 사용자가 많은 경우를 고려하면 사용하지 않는 것이 좋다. 또한 JWT 이용 목적에 적합하지 않다.
refresh token 를 데이터베이스에 저장한 후 index 값을 쿠키나 로컬스토리지에 저장하는 방법. 클라이언트 단에서 refresh token 을 노출하지 않는 추세로 바뀌는 중. refresh token을 DB에 저장해야만 탈취 당했을 때 해당 토큰을 폐기할 수 있다.(RTR기법=refresh token을 1회용으로 사용하기??)
⭐⭐⭐ 인증인가를 구현하는 로직에 정답은 없으니 충분히 고민해보고 답을 찾으면 된다.
참조
카카오 JavaScript 키를 이용한 API/SDK 사용 시 refresh token 응답 필드 제거 안내
refresh-token 도입기
refresh token 어디에 저장해야 할까?
axios interceptor