Search
Duplicate
🥼

[WEB,NEXTJS] JWT 토큰 무제한 사용

생성일
2022/11/23 04:15
태그
공개여부
현장실습을 진행하면서 토큰이 필요했다.
access token, refresh token이 필요한건 아니고 , api에 접근하는 c# 프로그램이 있는데 이 프로그램이 api에 접근하기 위한 토큰이 필요했다.
만약 이렇게 하지 않는다면 url만 알면 누구든지 그 api에 접근할 수 있었기 때문에 적절한 인증 수단이 필요했다.
간단한 로직으로
secret 키를 서버 env에 저장하고, 토큰의 expiresIn을 10만일(약 300년)로 설정하여 무기한 사용하게 했다.
그렇게 발급된 토큰을 클라이언트만 사용하는 프로그램에 내장하여 api로의 외부접근을 막게했다.
물론 c# 프로그램이 내장된 장비가 분실될 수 도 있는 경우의 수도 있는데 그 경우 token의 secretkey만 바꿔서 재발급 하면 해결 할 수 있다고 생각한다. 또 한 서버 해킹의 경우의 수가 있는데 서버가 해킹당하면 token이 의미가 있나? 라는 생각으로 위와 같은 로직을 구성했다.
사용한 라이브러리는 jsonwebtoken 으로 간단하게 로직을 구성할 수 있었다.
create-token.js
const jwt = require('jsonwebtoken'); export default function handler(req, res) { switch (req.method) { case 'POST': return authenticate(); } function authenticate() { const secret = process.env.NEXT_PUBLIC_SECRET; const token = jwt.sign({sub: {토큰},name: {이름},iat:{발행인}},secret, {expiresIn: '100000d'}); return res.status(200).json({ token }); } }
JavaScript
복사
verify.js
const jwt = require('jsonwebtoken'); const SECRET = process.env.NEXT_PUBLIC_SECRET; export default function decodeToken(token){ return new Promise( (resolve,reject)=>{ jwt.verify(token,SECRET,(error,decoded)=>{ console.log("error : " + error); console.log("decode : " + decoded); if(error) resolve(0); resolve(1); }); } ) }
JavaScript
복사
인증이 필요한 api 시작 지점에 아래와 같이 작성 해주면 인증이 완성되었다.
const tokenCheck = await decodedToken(req.headers['token']); if(tokenCheck == 0){ res.status(401).json({message: "토큰이 올바르지 않습니다."}); }
JavaScript
복사