일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- vue기초
- ethers typescript
- 머신러닝기초
- 스마트컨트렉트테스트
- 러스트 기초 학습
- 스마트컨트렉트 예약어 함수이름 중복
- 스마트 컨트렉트 함수이름 중복
- ethers v6
- ethers websocket
- 러스트기초
- 오블완
- 컨트렉트 배포 자동화
- 티스토리챌린지
- Vue.js
- multicall
- ethers
- erc4337
- rust 기초
- 체인의정석
- chainlink 설명
- 계정추상화
- 컨트렉트 동일한 함수이름 호출
- SBT표준
- ethers type
- 스마트컨트렉트 함수이름 중복 호출
- Vue
- git rebase
- ambiguous function description
- 러스트 기초
- erc4337 contract
Archives
- Today
- Total
체인의정석
Next.js) 프론트엔드에서의 JWT 관리 본문
728x90
반응형
1. JWT 저장 위치
JWT는 로컬 스토리지, 세션 스토리지에 사용이 가능한데 세션 스토리지에 사용하는 것이 주기가 더 짧음
개발자 도구의 Applicaion에 들어가면 세션 스토리지에 발급된 jwt를 확인할 수 있다.
2. 로그인시 JWT 발급
백엔드에 JWT에 대한 검증 로직 및 각 API에서 JWT의 role을 보고 처리하는 로직을 만들어 준다.
그러나 프론트엔드에서도 jwt의 기간이 만료되거나 유효한 형태인지 정도의 체크는 해주고 유효하지 않을 경우 로그인 화면으로 보내서 jwt를 재발급을 요청하는 과정이 필요하다.
interface JWTHeader {
alg: string;
typ: string;
}
interface JWTPayload {
wallet_address: string;
role: "example1" | "example2"; // 백엔드 기준
exp: number; // Unix timestamp (in seconds)
iat: number;
iss: string;
[key: string]: unknown; // 확장성을 위해
}
export function parseJWT(token: string): { header: JWTHeader; payload: JWTPayload } | null {
try {
const [headerB64, payloadB64] = token.split('.');
const header = JSON.parse(atob(headerB64));
const payload = JSON.parse(atob(payloadB64));
return { header, payload };
} catch {
return null;
}
}
export function isJWTExpired(token: string): boolean {
const parsed = parseJWT(token);
if (!parsed || !parsed.payload.exp) return true;
const exp = parsed.payload.exp * 1000; // JS는 ms 단위
return Date.now() > exp;
}
3. axios 를 보낼 때 header에 session storage의 JWT를 넣어준 후 api 요청 진행
import axios from "axios";
const axiosInstance = axios.create({
baseURL: process.env.API_URL || "http://localhost:3001",
withCredentials: true,
});
axiosInstance.interceptors.request.use((config) => {
const token = typeof window !== "undefined" ? sessionStorage.getItem("jwt") : null;
if (token) {
config.headers["Authorization"] = `Bearer ${token}`;
}
return config;
});
export default axiosInstance;
요청을 보낼 때는 다음과 같이 보냄
const data = {
wallet_address: toLowerAddress(walletAddress),
nick_name: userName,
team: teamName,
};
await axiosInstance.post("/example/register", data);
다만 로그인시 필요한 API나 healt같은 api는 jwt인증을 하지 않고서도 호출이 가능해야하기 때문에 다음과 같이 따로 인스턴스를 만들어서 구분하여 사용해주어야 한다.
const axiosPublicInstance = axios.create({
baseURL: process.env.API_URL",
});
728x90
반응형
'개발 > frontend' 카테고리의 다른 글
React + Next.js 에서 블록체인 지갑 기반 로그인 시스템 만들기 (프론트엔드) (0) | 2025.04.03 |
---|---|
Next.js "Use client" 사용법 (1) | 2025.04.02 |
Next.js Hydration 에러 처리 (Rainbow Wallet 사용 시 적용 필요) (0) | 2025.04.02 |
[React+Next+typescript+rainbow wallet] 관리자 페이지 만들고 rainbow wallet 붙이기 (블록체인 앱 관리자 페이지 만들기) (0) | 2025.03.27 |
Metamask + Next.js 적용해서 프론트 페이지 만들어보기 (0) | 2024.06.13 |
Comments