본문 바로가기
IT/개발지식

JWT(JSON Web Token)란?

by InfopediaBK 2023. 2. 7.
728x90

JWT (JSON Web Token)는 서버와 클라이언트 간에 정보를 안전하게 주고받는 방법 중 하나입니다. 현대의 웹서비스에서 사용자 인증을 처리하기 위해 가장 많이 사용되는 방식이 토큰 기반의 인증 방식입니다. JWT 역시 이름에서도 알 수 있듯이 토큰 기반의 인증 방식입니다. 그럼 지금부터 JWT에 대해 한 번 간략히 소개해보도록 하겠습니다.

JWT의 동작 방식

JWT는 헤더, 페이로드, 시그니처의 세 부분으로 구성됩니다.

헤더 (Header)

헤더는 일반적으로 토큰의 타입과 사용 중인 해싱 알고리즘(예: HMAC SHA256 또는 RSA) 이렇게 두 부분으로 구성됩니다.

  • typ: 토큰의 타입을 지정합니다.
  • alg: 사용 중인 해싱 알고리즘을 지정합니다. 이 알고리즘은 아래에서 소개될 시그니처 부분에서 사용됩니다.

페이로드 (Payload)

페이로드에는 Claim이 들어가게 됩니다. Claim에는 Private Claim과 Public Claim이 있고 보통 사용자에 대한 정보 및 추가 메타데이터에 대한 정보가 들어가게 됩니다.

시그니처 (Signature)

시그니처는 JWT를 전송한 사용자의 신원을 확인하고 메시지가 도중에 변경되지 않았는지 확인하는 데 사용됩니다. 시그니처는 헤더의 인코딩 값과 페이로드의 인코딩 값을 합친 후 비밀 키(Secret Key)로 해싱하여 생성하게 됩니다.

JWT의 장점

JWT는 세션 및 쿠키와 같은 기존 인증 방법보다 많이 쓰이는 만큼 명확한 장점이 몇 가지 있습니다. 첫 번째로 JWT는 HTTP 요청 헤더로 전송할 수 있기 때문에 사용하는데 큰 어려움이 없습니다. 또한 JWT는 사용자 인증에 대한 정보들을 모두 포함하고 있기 때문에 네트워크 요청의 필요성이 줄어들게 됩니다. 마지막으로, 토큰만을 가지고 인증을 처리하기 때문에 세션 같은 서버 인증 방식에 비해 서버에 대한 부하를 덜 수 있습니다.

JWT 구현

애플리케이션에서 JWT를 구현하려면 JWT 표준을 지원하는 라이브러리 또는 프레임워크를 선택해야 합니다. 저 같은 경우는 JS를 사용해서 간단하게 구현한 코드를 소개해드리도록 하겠습니다.

// 토큰 생성
import jwt from "jsonwebtoken";

app.post("/signIn", (req, res, next) => {
  const secretKey = "시크릿 키";
  const name = "User1";
  let token = "";

  token = jwt.sign(
    // Private Claim 위치
    {
      type: "JWT",
      name: name,
    },
    // 시그니처 (비밀키가 들어가는 자리)
    secretKey,
    // Public Claim 위치
    {
      expiresIn: "15m", // 15분후 만료
      issuer: "토큰 발급 주체",
    }
  );

  return res.status(200).json({
    code: 200,
    message: "토큰 생성 완료",
    token: token,
  });
});

 

// 토큰 인증
const verifyJWT = (req, res, next) => {
  const key = "시크릿 키";

  try {
    // Request Header에 있는 토큰 정보(authorization)과 비밀 키를 이용하여 검증
    const decoded = jwt.verify(req.headers.authorization, key);

    return next();
  } catch (error) {
    if (error.name === "TokenExpiredError") {
      return res.status(500).json({
        code: 500,
        message: "토큰 만료",
      });
    }

    // 토큰 에러
    if (error.name === "JsonWebTokenError") {
      return res.status(401).json({
        code: 401,
        message: "토큰 유효하지 않음",
      });
    }
  }
};

결론

결론적으로, JWT (JSON Web Token)는 기존 인증 방식에 비해 효율적이기 때문에 많이 사용되고 있는 인증 방식입니다. 물론, 토큰 자체를 탈취당하면 사용자의 인증 정보 자체를 모두 알 수 있는 등 JWT의 한계를 인식하는 것이 중요합니다, 다만, HTTPS를 사용하는 등 충분한 해결 방법도 존재하기 때문에 명확하게 알고 사용한다면 큰 문제는 없을 것 같습니다.

728x90

댓글0