stateless 상태이기 때문에 DB에 정보 담아두고 백엔드 분산 가능했음 - scaleOut 부하 분산
수직으로 파티셔닝
DB를 수직으로 자름
수평 파티셔닝 - 샤딩
DB도 백엔드처럼 분산 가능함
디스크에 저장하면 안날라가지만 느림
메모리에 저장하면 날아가지만 빠름 -> Redis에 저장
로그인된 정보를 객체현태로 만들어서 암호화해서 토큰처럼 만듬 - JWT - Authentication(인증)
복호화하면 객체로 나옴 - DB에 입력 필요없음
(현재 우리가 수업에서 쓰고 있는 방법)
email/password 입력하면 백엔드에서 JWT accessToken 만들고 브라우저로 전송
state에 저장하면 날아가므로 localStrage에 저장 - 토큰 탈취문제 생김(react-quill할때)
accessToken으로 그 사람이 맞는지, 로그인시간이 남았는지 확인 Authorization(인가)
JWT는 짧은 시간에 만료 되므로 불편 -> 리프레시 토큰!
로그인을 했을때 JWT 토큰을 두개 만듦
JWT1 - accessToken (payload - state)
JWT2 - refreshToken (cookie) - 쿠키의 httpOnly 옵션, secure옵션을 넣어서 받음 - https로만 가능 : 브라우저에서 조작 불가(자바스크립트에서 꺼낼 수 없음)
createProduct 하려는데 accessToken으로 로그인해서 1시간 지나면 토큰 만료 -> 인가:토큰만료 -> 브라우저에 에러를 던짐(UNATHENTICATED) -> restore Athentication 요청(refreshToken 따라감 - 자동으로 첨부됨) -> refreshToken(1~2달)까지 만료되었는지 확인 -> 만료되면 다시 로그인 -> 만료되지 않았다면 JWT토큰 하나 더 만들어서 브라우저에 전달(-> accessToken이 됨) -> 방금 전 실패했던 createProduct API 다시 요청 -> 요청성공
onError - 수많은 에러 중 UNATHENTICATED 이면
resoreAccessToken으로 accessToken 재발급받아서 globalState에 저장
방금 실패한 쿼리(API요청) 재시도
accessToken이 만료될때마다 반복
user는 아무것도 모름 -> 조용한 인증(silentAuth)
createProduct 같은 API만 모아놓은 백엔드 폴더 - Resource Service(인가만 이루어짐)
-> boardService, productService 를 모두 나눔(DB도 나눔) -> 이렇게 잘게 쪼갠 것 - 마이크로 서비스 아키텍쳐(MSA) -> 게시판API에서 문제가 생기면 게시판만 작동안함(다른 것들은 작동함) - 배포도 쉬워짐(빌드할때 빠르고 안정적)
인증관련된 것만 모아놓은 백엔드 폴더 - Auth Service(인증이 이루어짐)
-> 인증만 모아놓은 것 Open Athentication(OAuth - 소셜로그인)