사용자 인증 방식 2) JWT(Json Web Token)

Yeshin Lee
4 min readSep 5, 2024

--

로그인 혹은 데이터를 전송하고 인증하는 기능을 구현할 때, JWT에 대해서는 한 번씩 들어봤을 것이다. 나 역시 사용해본 적은 있지만, 다 까먹었기 때문에 리마인드할 겸 작성한다.

JWT는 당사자 간 정보를 JSON 형식으로 안전하게 전송하는 개방형 표준(RFC 7519)이다.

이전 포스트에서 가볍게 언급하고 넘어간 JWT의 특징에 대해 좀 더 알아보자.

  • 무상태성(Statelessness): 클라이언트 환경에서 여러 분산 서버가 사용자 요청을 처리하므로 서버가 각 사용자의 상태를 유지하는 것이 어렵다. JWT는 토큰 기반으로 사용자를 인증하므로 서버는 클라이언트의 상태를 유지하지 않아도 된다.
  • 확장성(Scalability): 사용자의 인증 정보와 데이터를 토큰에 저장하므로 여러 서버에 동일한 사용자 정보를 제공할 수 있다.
  • 보안(Security): 서명된 토큰을 사용하므로 데이터 무결성을 보장하고, 토큰(Access Token)에는 유효기간이 존재하여 유효 기간이 만료됐을 때, Refesh Token을 통해 Access Token을 재발급 받을 수 있다.
  • 그 외에 웹, 앱 등 다양한 클라이언트를 지원하고 RESTful API의 무상태성 요구에 충족한다.

JWT는 header.payload.signature 형식으로 구성된다.

Header

토큰에 대한 메타 데이터를 포함한다.

{
"alg": "HS256", # algorithm(HS, SHA, RSA etc)
"typ": "JWT" # token type
}

Payload

토큰의 핵심으로 주체에 대한 정보(claim, 클레임)를 담는다. 클레임은 등록된 클레임(sub), 공개 클레임(name), 비공개 클레임(iat)로 나눈다.

{
"sub": "1234567890", # subject: user id, user identification
"name": "yeslee", # user name
"iat": 1516239022 # issued at: the time when the token was created
}

공개 클레임(name, email 등)의 경우, 표준 클레임이 아니므로 사용자가 자유롭게 정할 수 있다.

Verify Signature

데이터 무결성을 보장하는 요소로 서명을 검증할 때, 비밀 키를 사용하여 서명 변조 유무를 확인할 수 있다. 서명은 서버만이 검증할 수 있다.

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
{ your-256-bit-secret-key }
)

마지막에 위치한, 서버가 설정한 비밀키를 HMACSHA256 알고리즘을 통해 해싱을 수행, 해싱된 서명 값이 생성된다.

node 환경에서는 jsonwebtoken npm 패키지를 사용하여 JWT를 생성할 수 있다.

const jwt = require('jsonwebtoken');

# payload: { id: 1234567890, name: 'yeslee' }
const token = jwt.sign({ id: 1234567890, name: 'yeslee' }, 'secret-key', { expiresIn: '1h' });

console.log(token)

--

--

Yeshin Lee
Yeshin Lee

No responses yet