refreshToken,성능최적화
토큰만료시 로그인다시해주는것 -> 자동로그인방식으로..
로컬스토리지에 토큰 저장시 보안문제있음. 따라서 새로고침시에도 토큰 새로 발급받기!!
연장방법이해하기.
기존 accessToken 부분..
회원가입을 먼저 -> 로그인테이블에 유저하나 등록(게시글 등록과 비슷한개념)
로그인을 하고 -> 인증 ==> accessToken발급받고,브라우저에 그 토큰을 저장해둠.유저정보가 필요한 요청들을 토큰과 함께보내 확인 -> 인가
이 과정에서 많은 정보들을 저장하면 메모리 많이 필요 -> 메모리를 올림-> 스케일 업.
컴퓨터를 하나더 구입해 같은 벡엔드 소스코드를 붙여넣고, 확장 ->스케일 아웃.
그러나 스케일 아웃방식을 사용하면 인증으로 발급받은 토큰정보가 어떤 컴퓨터에는 없고 어떤컴퓨터에는 있는 상태가 될 수 있다.(상태를 가지기 때문에 스테이트 풀 이라고한다.)
따라서 어차피 표 형태이니 DB로 옮겨버린다. 이렇게되면 벡엔드는 스테이트 리스상태가된다.
그러나...
결국 로그인한 정보를 가지고오려고 DB의 세션테이블(로그인 토큰등을 저장한테이블)로 가야하는데, 많은 접근이 일어나 병목현상이 일어난다.
-> 그럼 DB도 스케일 아웃하면 되지 않나?
DB의 많은 테이블들을 복사해 여러컴퓨터들에 저장하는것은 문제가 있다.(너무많음.)따라서 이 경우에는 테이블을 쪼게서(파티셔닝) 분산저장한다.
이렇게 메모리문제는 해결되었다.
그런데 DB는 디스크 기반저장.. 이라 매번 인가시 세션테이블로 갔다와야하는데 좀 느리게 된다.
따라서 아예 이 셰션 테이블을 메모리에 저장해 갔다오게 하여 빠르게 받아온다(메모리기반 저장소사용)
로그인 -> 로그인 API인증. 유저테이블확인해 정보있는지 확인, -> 세션테이블에 저장... ->x
세션테이블말고 객체에 저장. ---> 객체를 통채로 암호화하여 토큰을 만들어냄-> 인증 -> 만든토큰을
그리고 api요청으로 인가를함-> 벡엔드 자체에서 바로 복호화 - > 인가
ㅇ;렇게되어 인가시에는 DB까지는 가지 않고, 벡엔드에서만 처리하고, 인증시에만 DB로.
-> 그런데 현실적으로는 아직까지는 redis도 사용하는중.
로그인시 두개의 토큰을 받을 수 있음--> refresh토큰, accessToken.
보안을위해 accessToken은 변수에, refresh는 쿠키에 담고, httpOnly라는 설정을 주어 자바스크립트로 꺼내올 수 없게하여(접근불가) 해킹의 위험을 막는다 거기에 추가로 secure옵션을 주어 https에만 가능하게한다.
유저정보가 필요한 aPi요청을 한다 -> 인가. 이 과정에서 토큰 만료가 된다면--> 재로그인 필요 ->>>>>> 번거로움.
따라서 refresh토큰을 사용한다.
- 쿼리를 요청하는데 에러가난다.
- 에러중에 토큰만료에러인지를 체크한다
- refreshToken을 가지고 restoreAccessToken이라는 api를 사용해 accessToken을 재발급받는다.
- 실패쿼리를 재시도한다.
- 인가에 성공하면 해당 요청에 맞는 정보를 가져다준다.
RestoreAccessToken이라는 aPi가 현재있음. 재발급 요청하는 aPi. 이때 refresh토큰을사용해 요청하는데 이때 refresh토큰을 인가하는것.
accessToken의 만료시간이 짧은 이유. => 이 시간동안 탈취당할 수도 있기에 만료시간을 짧게하여 방지.
그럼 유저입장에서는 이 과정이 어떻게 일어날까?
유저입장에서는... 이 토큰만료가 일어난 상태에서 에러를 캐치하면 refresh토큰을 받고 -> 이것을 가지고 다시 accessToken을 발급받는데 이 과정이 빠르게 일어나 유저는 알아채지못함.(조용히 한시간마다 요청이 들어가고 토큰을 받아옴)
조용히 모르게 일어난다고해서
SilentAuth(=> silent Authentication 조용한 인가)라고한다.
로그인, restoreAccessToken, 로그아웃(토큰없에기.) -> 인증관련된 서비스라고 하여 AuthService라고한다.
인증관련외의 서비스를 자원을 가지고있다고하여 resorce서비스 라고한다.
이렇게 벡엔드에서는 두가지로 나누는데,
이렇게 서비스를 나누는것을 마이크로서비스 아키텍쳐라고하며 (MSA)라고한다.(프로필서비스, 보드서비스, Auth서비스) ->각각 하나의 컴퓨터들.
이 각각이 api서비스, 이 서비스들을 따로해서 사용할 수 있게 해놓은것이 있다. -> 각각의 AuthService 등....
그리고 이 인증을통해 정보를 받아와 사용할 수 있다. ---> 이것이 구글로 로그인하기, 카카오로 로그인하기가 가능한것.
=> 이것을
리프레쉬토큰
-토큰만료에러
-토큰재발급
-실패한쿼리 재시도
브라우저상에서 유저는 모르기에 사일런트auth라고함.
로그인시 리프레쉬, accessToken이렇게 두가지 토큰을 받고, 이후 리프레쉬 토큰을 이용해 accesstoken을 재발급받는다.
실습하기
5초만료인 accessToken을 이용해 실습.
네트워크 탭과 함께보기.
refreshToken쿠키에 저장하기