JsonWebToken

PromptAction·2024년 8월 6일
0

백엔드

목록 보기
20/20

JsonWebToken

정의

  • JSON 객체를 사용해 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519). 주로 인증 및 정보 교환에 사용되며, 클라이언트와 서버 간의 신뢰할 수 있는 정보를 전달할 수 있게 설계됨.

구조

세 부분으로 구성됨

  • 토큰의 유형과 서명 알고리즘을 지정. 예를 들어 {"alg": "HS256", "typ": "JWT"} 형태.

Payload

  • 실제 데이터가 포함되는 부분으로, 사용자 정보 및 메타데이터를 담는다. Base64URL로 인코딩

Signature

  • 헤더와 페이로드를 결합하여 비밀 키로 서명한 부분. 이 서명을 통해 토큰이 변조되지 않았음을 확인할 수 있음.
header.payload.signature

작동방식

  • 사용자가 로그인하면 서버는 사용자의 정보를 기반으로 JWT를 생성.
  • 생성된 JWT는 클라이언트에 전달되며, 클라이언트는 이를 로컬 저장소에 저장.
  • 이후 클라이언트는 서버에 요청을 보낼 때 마다 JWT를 포함시켜 인증을 수행.
  • 서버는 JWT를 검증하여 사용자의 신원을 확인하고 요청을 처리함.

장점

  • 자체 포함 : JWT는 필요한 모든 정보를 포함하고 있어, 서버가 세션 상태를 저장할 필요가 없음.
  • 스케일링 : 서버 간 상태를 공유할 필요가 없으므로, 수평 확장에 유리
  • 보안 : 서명을 통해 데이터의 무결성을 보장
  • 유연성 : 다양한 데이터 형식을 지원하며, 다양한 플랫폼에서 사용 가능

단점

  • 토큰 크기 : JWT는 필요한 모든 정보를 포함하므로, 쿠키나 세션 ID보다 크기가 커질 수 있음
  • 만료 문제 : JWT 가 만료되면 사용자는 다시 로그인해야하며, 이 과정에서 사용자 경험이 저하될 수 있음
  • 재사용 공격 : JWT가 탈취되면 만료될 때 까지 악용 가능. 이를 방지하기 위해 HTTPS를 사용해야 함

jsonwebtoken jwt.io를 들어가보면
https://jwt.io/

이것저것 만져볼 수 있다.

Node.js 패키지 매니저인 npm을 사용해

npm i jsonwebtoken

으로 설치.

import jwt from 'jsonwebtoken'

으로 불러온다.

토큰 발급은 sign() 함수로

jsonwebtoken에서는 sign() 함수를 제공.

예를들어

const token = jwt.sign({ email: "test@user.com" }, "our_secret");
console.log(token);

하면

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRlc3RAdXNlci5jb20iLCJpYXQiOjE2Nzg5MjAxMjV9.7agGY4Sx7wWY0vZe25tfsrpIcDUHf5N6XP1W3MfxhWI

로 나온다

토큰의 만료시간을 설정하고 싶다면 세번째 인자로 expiresin 옵션을 명시해준다

const token = jwt.sign({ email: "test@user.com" }, "our_secret", {
  expiresIn: "1h",
});

나는

const issuedAt = Math.floor(Date.now() / 1000)
    const expirationTime = issuedAt + 5400 // 90분
    const token = sign(
        {
            id: checkAccount[0].id,
            email: checkAccount[0].email,
            department: checkAccount[0].depart,
            position: checkAccount[0].position,
            iat: issuedAt,
            exp: expirationTime,
        },
        SECRET_KEY
    )

이렇게 설정해주고 쓴다.

0개의 댓글