JWT에 대해서 알아보자

권태형·2023년 2월 24일

U-eat

목록 보기
2/7
post-thumbnail

U-eat 프로젝트에서 회원관리를 맡아 회원정보 인증을 위해 Token 을 이용한 인증처리방식을 이용하게 되었다.
이 Token을 이용한 인증방식에 대해 알아보자. Token인증 방식의 가장 큰 특징은 Stateless한 부분이다.

Stateless함은 무엇일까?

Stateless는 서버가 클라이언트의 세션 상태 및 세션 정보를 저장하지 않는 형태를 말한다.

그럼 이제 Token 방식에 사용될 JWT에 대해 알아보자

JWT란?

JWT(JSON Web Token)은 웹에서 인증을 위해 사용되는 JSON 기반의 토큰이다. JSON기반이기 때문에 문자열의 형태를 띈다.

JWT의 구성

JWT는 세 파트로 구성되어 있다.

Header
Payload
Signature

JWT 웹사이트에 접속해 보면 Decode된 부분을 보았을 때 간단하게 확인할 수 있다.

토큰은 각 .을 기준으로 토큰의 Header, Payload, Signature의 정보를 담고 있다.

Header는 토큰의 유형과 해싱 알고리즘 정보를 담고 있다. Payload는 토큰에 포함되는 정보를 담고 있으며, 클라이언트의 정보나 권한 등의 정보를 포함할 수 있다. Signature는 서버에서 발급된 비밀 키를 사용하여 생성되며, 토큰이 변조되었는지 검증하는 데 사용된다.

JWT로 구현한 인증기능의 동작방식

JWT를 사용하면 인증 서버가 필요 없이 토큰을 통해 클라이언트를 인증할 수 있다. 클라이언트는 로그인을 성공적으로 수행하면 JWT를 발급 받는다. 그리고 나서 클라이언트는 매 요청 시에 JWT를 헤더에 포함하여 서버로 전송한다.

// 로그인 시 토큰을 발금하는 부분, 토큰에 유저의 정보(userId)와 검증할 비밀키, 만료시간을 설정
const token = await jwt.sign(
      { userId: isExistUser.userId },
      JWT_SECRET_KEY,
      {
        expiresIn: '1h',
      },

서버는 JWT의 유효성을 검사하고, 검증이 완료되면 클라이언트의 요청을 처리한다(보통 middleWare의 형태로 API요청 전에 Token을 검증).

재발급 방식 및 주기는 보통 JWT에 만료시간(expiration time)을 설정하고, 이를 기준으로 새로운 JWT를 발급하는 방식으로 처리하거나, 로그인 자체를 다시 하게끔 유도해서 새로운 JWT를 발급 받도록 한다.

또한, JWT를 사용하여 인증이 필요한 특정 API 서비스를 호출할 때에는, 호출되는 API 서비스에서도 JWT를 검증하고 인증(위에 작성한 middleWare 형태의 Token인증)하는 과정이 필요하다.

//middleWare 부분 로그인이 안된 유저가 접근시 에러발생
const loggedInYet = async (req, res, next) => {
  try {
    const { authorization } = req.headers;
    if (!authorization) throw err;
    const [tokenType, tokenValue] = authorization.split(' ');
    if (tokenType === 'Bearer' && tokenValue)
      res.locals.userId = jwt.verify(tokenValue, JWT_SECRET_KEY).userId;
    next();
  } catch (err) {
    next(new ApiError('로그인 정보 없음', 401));
  }
};

//라우터 요청부분
router.post('/posts/:postId', authMiddleware.loggedInYet, likeController.changeLike)

JWT의 사용시 장점

JWT를 사용하면, 클라이언트의 상태를 저장하지 않기 때문에 확장성과 유연성이 높아진다. 또한, 클라이언트와 서버 간의 상호 작용을 줄일 수 있어, 성능도 개선된다고 한다.

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글