Front/NextJS
[NextJS] Access Token 관리
Awesome-SH
2021. 10. 1. 09:56
정리이유
: 페이지 새로고침 시 State가 사라지고 SSR 랜더링에서는 처리방법이 다르기 때문
JWT Access Token을 관리하는 3가지 방법
- Cookie
- Local Storage
- Session
위 3가지 방법에서 Cookie를 활용해 Token을 관리하고
Session을 유지시키는 방법에 대해 정리
Install Package
npm i react-cookies next-cookies
npm i @types/react-cookies (타입스크립트 사용 시)
*next-cookies 패키지는 Cookie에 담겨있는 값들을 JSON 형태로 변환해줍니다.
// 기존 Cookie가 값을 보관하는 방식
accessToken=ABCDEDFD; refreshToken=DFSGGDF;
// next-cookies로 Cookie 값을 JSON 포맷으로 변환
{
accessToken: 'ABCDEDFD',
refreshToken: 'DFSGGDF'
}
Next JS 설정
: 페이지 새로고침 시 Token 유지
_app.tsx 안에 appContext 내용 (AppTree, Component, router, ctx)
이 4개중에 ctx 확인
...
App.getInitialProps = async (appContext: AppContext) => {
const appProps = await App.getInitialProps(appContext)
const {ctx} = appContext;
console.log(Object.keys(ctx));
/* ctx의 키값들
[
'err', 'req',
'res', 'pathname',
'query', 'asPath',
'AppTree'
]
*/
...
Cookie는 ctx > headers > cookie 에 담겨있습니다
...
const cookieReq = ctx.req ? ctx.req.headers.cookie : null
console.log("cookieReq: ", cookieReq)
// cookieReq: accessToken=AAA; refreshToken=BBB
...
next-cookie 를 이용해 header에 있는 cookie를 json으로 변경합니다
...
const allCookies = cookies(ctx);
console.log("allCookies: ", allCookies)
const accessTokenByCookie = allCookies['accessToken'];
console.log("accessTokenByCookie: ", accessTokenByCookie)
/*
출력내용
allCookies: {
accessToken: 'AAA',
refreshToken: 'BBB'
}
accessTokenByCookie: AAA
*/
...
최종 코드
Token 관리 컴포넌트로 쿠키값을 넘겨줍니다
// _app.tsx
import {setToken} from "../function/TokenManager";
import cookies from "next-cookies";
...
...
App.getInitialProps = async (appContext: AppContext) => {
const appProps = await App.getInitialProps(appContext)
const {ctx} = appContext;
const allCookies = cookies(ctx);
const accessTokenByCookie = allCookies['accessToken'];
if(accessTokenByCookie !== undefined) {
const refreshTokenByCookie = (allCookies["refreshToken"] || "");
setToken(accessTokenByCookie, refreshTokenByCookie)
}
return {...appProps}
}
...