28Day

김하은·2023년 2월 23일
0

refreshToken,성능최적화


토큰만료시 로그인다시해주는것 -> 자동로그인방식으로..

로컬스토리지에 토큰 저장시 보안문제있음. 따라서 새로고침시에도 토큰 새로 발급받기!!


로그인 만료시간연장.

연장방법이해하기.

기존 accessToken 부분..

회원가입을 먼저 -> 로그인테이블에 유저하나 등록(게시글 등록과 비슷한개념)
로그인을 하고 -> 인증 ==> accessToken발급받고,브라우저에 그 토큰을 저장해둠.

유저정보가 필요한 요청들을 토큰과 함께보내 확인 -> 인가

이 과정에서 많은 정보들을 저장하면 메모리 많이 필요 -> 메모리를 올림-> 스케일 업.
컴퓨터를 하나더 구입해 같은 벡엔드 소스코드를 붙여넣고, 확장 ->스케일 아웃.

그러나 스케일 아웃방식을 사용하면 인증으로 발급받은 토큰정보가 어떤 컴퓨터에는 없고 어떤컴퓨터에는 있는 상태가 될 수 있다.(상태를 가지기 때문에 스테이트 풀 이라고한다.)
따라서 어차피 표 형태이니 DB로 옮겨버린다. 이렇게되면 벡엔드는 스테이트 리스상태가된다.

그러나...

결국 로그인한 정보를 가지고오려고 DB의 세션테이블(로그인 토큰등을 저장한테이블)로 가야하는데, 많은 접근이 일어나 병목현상이 일어난다.
-> 그럼 DB도 스케일 아웃하면 되지 않나?

DB의 많은 테이블들을 복사해 여러컴퓨터들에 저장하는것은 문제가 있다.(너무많음.)따라서 이 경우에는 테이블을 쪼게서(파티셔닝) 분산저장한다.

이렇게 메모리문제는 해결되었다.
그런데 DB는 디스크 기반저장.. 이라 매번 인가시 세션테이블로 갔다와야하는데 좀 느리게 된다.
따라서 아예 이 셰션 테이블을 메모리에 저장해 갔다오게 하여 빠르게 받아온다(메모리기반 저장소사용)

로그인 -> 로그인 API인증. 유저테이블확인해 정보있는지 확인, -> 세션테이블에 저장... ->x
세션테이블말고 객체에 저장. ---> 객체를 통채로 암호화하여 토큰을 만들어냄-> 인증 -> 만든토큰을

JsonWebToken =>JWT 라고함

그리고 api요청으로 인가를함-> 벡엔드 자체에서 바로 복호화 - > 인가

ㅇ;렇게되어 인가시에는 DB까지는 가지 않고, 벡엔드에서만 처리하고, 인증시에만 DB로.
-> 그런데 현실적으로는 아직까지는 redis도 사용하는중.


RefreshToken

로그인시 두개의 토큰을 받을 수 있음--> refresh토큰, accessToken.
보안을위해 accessToken은 변수에, refresh는 쿠키에 담고, httpOnly라는 설정을 주어 자바스크립트로 꺼내올 수 없게하여(접근불가) 해킹의 위험을 막는다 거기에 추가로 secure옵션을 주어 https에만 가능하게한다.

쿠키특징 -> API요청시 같이 들어간다.

유저정보가 필요한 aPi요청을 한다 -> 인가. 이 과정에서 토큰 만료가 된다면--> 재로그인 필요 ->>>>>> 번거로움.

따라서 refresh토큰을 사용한다.

  • 쿼리를 요청하는데 에러가난다.
  • 에러중에 토큰만료에러인지를 체크한다
  • refreshToken을 가지고 restoreAccessToken이라는 api를 사용해 accessToken을 재발급받는다.
  • 실패쿼리를 재시도한다.
  • 인가에 성공하면 해당 요청에 맞는 정보를 가져다준다.

RestoreAccessToken이라는 aPi가 현재있음. 재발급 요청하는 aPi. 이때 refresh토큰을사용해 요청하는데 이때 refresh토큰을 인가하는것.

accessToken의 만료시간이 짧은 이유. => 이 시간동안 탈취당할 수도 있기에 만료시간을 짧게하여 방지.

그럼 유저입장에서는 이 과정이 어떻게 일어날까?

유저입장에서는... 이 토큰만료가 일어난 상태에서 에러를 캐치하면 refresh토큰을 받고 -> 이것을 가지고 다시 accessToken을 발급받는데 이 과정이 빠르게 일어나 유저는 알아채지못함.(조용히 한시간마다 요청이 들어가고 토큰을 받아옴)

조용히 모르게 일어난다고해서
SilentAuth(=> silent Authentication 조용한 인가)라고한다.


웹트렌드

로그인, restoreAccessToken, 로그아웃(토큰없에기.) -> 인증관련된 서비스라고 하여 AuthService라고한다.

인증관련외의 서비스를 자원을 가지고있다고하여 resorce서비스 라고한다.

이렇게 벡엔드에서는 두가지로 나누는데,

현재는 이 resorce서비스 부분도 세부적으로 나눈다. => 즉, 서버를 나누는것.

이렇게 서비스를 나누는것을 마이크로서비스 아키텍쳐라고하며 (MSA)라고한다.(프로필서비스, 보드서비스, Auth서비스) ->각각 하나의 컴퓨터들.
이 각각이 api서비스, 이 서비스들을 따로해서 사용할 수 있게 해놓은것이 있다. -> 각각의 AuthService 등....
그리고 이 인증을통해 정보를 받아와 사용할 수 있다. ---> 이것이 구글로 로그인하기, 카카오로 로그인하기가 가능한것.

=> 이것을

소셜로그인 = Open Authentication =OAuth라고한다.


리프레쉬토큰
-토큰만료에러
-토큰재발급
-실패한쿼리 재시도

브라우저상에서 유저는 모르기에 사일런트auth라고함.

로그인시 리프레쉬, accessToken이렇게 두가지 토큰을 받고, 이후 리프레쉬 토큰을 이용해 accesstoken을 재발급받는다.


실습하기

5초만료인 accessToken을 이용해 실습.
네트워크 탭과 함께보기.
refreshToken쿠키에 저장하기

0개의 댓글

관련 채용 정보