30日目

9424 ワード

stateful/stateless
scaleup/scaleout
RoundRobin)バックエンド間でデータを切り替える
最小接続(Least Connection)は、データが最も少ないバックエンドにデータを送信します.
パーティション、、、データベース分割垂直パーティション/水平パーティション(Shading)
分散型データベースでは、データはディスクに格納されますが、永続的に格納されます.
Redisメモリに格納されているデータ(永続的なストレージに変更できますが、基本的には非永続的なデータ)
ハッシュ方式はデータを不可知にし、一方向暗号化パスワードをハッシュ!!
ユーザー情報をタグに保存する->JSON Web Token
(JSON JavaScriptオブジェクトシンボル)
奪われる可能性があるので、短い期限を30分~2時間程度あげます.
accessToken 1時間後に使用できない部分はrefreshTokenを使用してトークンを再発行できます.

リソース・サービス:>ハードウェア・サービス/ユーザー編集サービス/BasketService(MicroService Architecture,MSA)などの小さなユニットに分割されます.
その利点は、障害が発生した場合、すべてのサービスが停止するが、2つのセクションに分割された場合、障害が発生したサービスのみが停止し、残りのサービスが利用できることです.
AutheServiceにログインすると、2つのJWTが取得されます.1つはaccessToken、もう1つはrefreshTokenです.
ブラウザでaccessTokenをstate形式で保存し、refreshTokenをクッキーに保存します.
CookieオプションでhttpOnly:true、secure:true
httponlyはJSをサポートしていません
secureはhttpsでのみ実行
CookieはAPI要求時に自動的にフォローアップする特徴がある

accessTokenとdataをヘッダに配置し、バックエンドで要求とデータを受信します.
error:UNAUTHENTICATEDでエラーキャッシュを行い、対応するauthServiceはrefreshTokenを提供し、新しい受信accessTokenのAPIを要求し、accesstokenが有効であることを検証した後、無効であれば新しいaccesstokenに戻る.受信したaccesstokenを使用して失敗したリクエストを再試行します.

refreshTokenの方法
const errorLink = onError(({ graphQLErrors, operation, forward }) => {
    if (graphQLErrors) {
      for (const err of graphQLErrors) {
        // 토큰 만료 에러 시
        if (err.extensions.code === "UNAUTHENTICATED") {
          // restore token
          // const newAccessToken = getAccessToken(setMyAccessToken);

          // 재요청
          operation.setContext({
            headers: {
              ...operation.getContext().headers,
              authorization: `Bearer ${getAccessToken(setMyAccessToken)}`,
            },
          });

          return forward(operation);
        }
      }
    }
  });
import { GraphQLClient } from "graphql-request";
import { gql } from "@apollo/client";
import { Dispatch, SetStateAction } from "react";

const RESTORE_TOKEN = gql`
  mutation restoreAccessToken {
    restoreAccessToken {
      accessToken
    }
  }
`;

export const getAccessToken = async (
  setMyAccessToken: Dispatch<SetStateAction<string>>
) => {
  try {
    const graphQLClient = new GraphQLClient(
      "https://backend04.codebootcamp.co.kr/graphql",
      {
        credentials: "include",
      }
    );
    const result = await graphQLClient.request(RESTORE_TOKEN);
    const newAccessToken = result.restoreAccessToken.accessToken;
    setMyAccessToken(newAccessToken);
    return newAccessToken;
  } catch (error) {
    console.log(error.message);
  }
};
気をつけて!
brower renderの前にerrorを書くのでerror部分は先に書きます!