JWT Authorization 발급 및 활용 정리

henry·2024년 10월 16일

1. JWT와 Authorization

JWT(JSON Web Token)는 서버와 클라이언트 간의 인증정보 교환에 사용되는 토큰입니다.

클라이언트가 서버로부터 발급받은 JWT를 Authorization 헤더에 담아 사용하는 방법을 정리했습니다.



2. JWT 발급 API 구현

소스 코드

let jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
const dotenv = require('dotenv');
dotenv.config();

app.listen(process.env.PORT, () => {
   console.log(`Server on port number : ${process.env.PORT}.`);
});

app.get('/jwt', (req, res) => {
   let token = jwt.sign({ foo: 'bar' }, process.env.PRIVATE_KEY);
   res.cookie('jwt', token, {
      httpOnly: true,
   });
   res.send(token);
});
  • 환경 설정 : dotenv 모듈을 사용해 .env 파일에 저장된 PRIVATE_KEY와 PORT를 불러옵니다.
  • JWT 발급 : /jwt 경로로 요청이 들어오면 토큰을 생성하고 응답에 담아 보냅니다.
  • 쿠키에 저장 : 발급된 JWT를 httpOnly 쿠키로 클라이언트에 전달합니다.

Postman을 이용한 JWT 발급 확인

Postman에서 /jwt API에 GET 요청을 보내면 JWT가 응답으로 발급됩니다.



3. JWT와 Request/Response Header

응답(Response) 헤더의 JWT
서버가 응답으로 JWT를 발급하면 아래와 같이 Response Header에 포함됩니다.

Request Header의 자동 전송 문제

  • 응답에서 받은 JWT가 Request Header의 Authorization 항목에 자동으로 포함되는 경우가 발생할 수 있습니다.
  • Request Header에 저장된 JWT와 Response Header의 JWT가 일치하지 않는 경우도 확인할 수 있습니다.
Request Header's cookieResponse Header's cookie
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE3MjkwNjE1NjR9.X-owiNW41CHDZmOOfOqIUAOat7QALd2XOsinI7hbtrAeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE3MjkwNjE1Njl9.9oiB9U6nnBiaBXjPiz-CxeGFrUmJ27nmSPVlhipRs2s

4. JWT 쿠키 문제와 해결 방법

다시 한 번 토큰 발행 요청을 했습니다.

직전에 요청해서 받은 Response cookie를 Server에 전달하고 있습니다.

  • 인터넷 사용 중 이전의 쿠키가 누적되면서 인증 오류가 발생할 수 있습니다.
  • 쿠키를 삭제하면 정상적으로 작동할 때가 많습니다.

5. JWT 디코딩 API 구현

클라이언트에서 Authorization 헤더에 담아 보낸 JWT를 디코딩해 보겠습니다.

소스 코드

app.get('/jwt/decoded', (req, res) => {
   let token = req.headers['authorization'];
   let decoded = jwt.verify(token, process.env.PRIVATE_KEY);
   res.send(decoded);
});

JWT 디코딩
클라이언트가 Authorization 헤더에 담아 보낸 JWT를 서버에서 추출해 jwt.verify()로 디코딩합니다.

보안 유의점
JWT는 민감한 정보가 포함될 수 있어 Authorization 헤더에 담아 보내는 것이 안전합니다.


Authorization 헤더에 JWT 전달

아래와 같이 Postman에서 발급된 JWT를 Authorization 헤더에 직접 추가해 요청을 보냅니다.

위 사진에서 보이는것과 같이 Header의 Authorization항목에 방금 발행된 토큰을 넣고 디코딩을 요청합니다.


JWT 디코딩 결과 확인

서버는 Authorization 헤더에서 받은 JWT를 디코딩해 응답으로 반환합니다.


6. 정리

JWT 발급
서버가 JWT를 발급해 클라이언트에 쿠키와 응답으로 전달합니다.

Authorization 헤더 사용
클라이언트는 JWT를 Authorization 헤더에 담아 API 요청 시 인증합니다.

보안 및 관리 주의점
이전의 쿠키가 누적되면 오류가 발생할 수 있으며, 쿠키를 삭제하면 해결됩니다.
Authorization 헤더를 사용해 JWT를 안전하게 전달하는 것이 좋습니다.

JWT를 이용한 인증은 간결하고 효율적이지만, 쿠키 및 헤더 관리에 주의해야 합니다.

0개의 댓글