JWT란 무엇인가? 그리고 어떻게 사용하는가? (2) - 사용처

Eon Kim·2021년 10월 7일
3

JWT

목록 보기
2/4
post-thumbnail

안녕하세요, 주니어 개발자 Eon입니다.

이번 글에서 다룰 내용은 JWT가 사용되는 순서입니다.

JSON Web Token 인증 수단입니다. 토큰으로 해당 요청이 유효한지 확인할 수가 있습니다.

Without JWT : JWT가 없는 경우

먼저 살펴볼 것은 JWT가 없는 경우입니다.
일반적인 간단한 로그인은 다음과 같이 이루어집니다.

A라는 사용자가 서비스에 접근을 원합니다.
A는 우리 서비스에 가입이 승인된 사용자입니다.
A는 정상적으로 우리의 서비스를 이용할 수 있습니다.
B라는 사용자 서비스에 접근을 원합니다.
B는 우리 서비스에 가입 승인이 되지 않은 사용자입니다.
B는 정상적으로 우리의 서비스를 이용할 수 없습니다.

로그인을 할 때 사용자의 ID와 PWD를 서버로 보내고, 서버는 DB 조회를 통해 해당 사용자가 승인이 된 사용자인지 검증합니다.
검증된 사용자라면 '로그인 성공', 검증에 실패한 사용자라면 '로그인 실패' 응답을 보냅니다.
로그인을 한 사용자는 서비스를 이용할 수 있습니다.
Q: 정말 로그인을 한 사용자만 서비스를 이용할 수 있나?
A: 아닙니다. Request API URI, body와 구성 헤더를 알면 로그인을 하지 않아도 서버에 요청을 보낼 수 있습니다.

여기서 우리의 서비스 구성을 가정합니다.

사용자 <---> 계정 관리 및 REST-API 서버 (로그인)

우리가 원하는 로직은 이러합니다.
사용자는 로그인을 하고, 로그인된 사용자에 한해서 REST-API를 이용하여 서비스를 제공받습니다.
위에서 이야기한 대로 지금 우리의 서비스 구성에서는 로그인을 한 유저가 보낸 요청인지, API URI로 직접 Request한 케이스인지 확인할 수 있는 방법이 없습니다.
그래서 JWT를 사용합니다.

Include JWT : JWT를 포함하는 경우

JWT를 사용하면 다음과 같이 구성할 수 있습니다.

로그인 성공 시, JWT 인증 성공 시입니다.
(실패 시에는 실패 응답이 반환됩니다.)
사용자 | ===== ID / PWD ====> 계정 관리 및 REST-API 서버 (로그인)
      | <======= JWT ======= 로그인 성공 시, JWT 발급
      | ==== 요청 + JWT ====> JWT 인증 성공 시, REST-API 요청      

다음의 Workflow를 확인합니다.

(※그림은 직접 그렸으며, 영리 목적으로 사용되는 걸 금지하고, 사용 시 출처를 명확히 밝혀 주시기 바랍니다.)

이 그림의 위 내용을 모두 이해한 사람이 이 그림에서 의문을 가질 수 있는 내용들입니다.
access token, refresh token이 무엇인가?

  • access token : API를 사용하기 위한 인증용 토큰
    이 토큰이 만료되면 access token이 없는 것과 마찬가지입니다.
    따라서 접근을 막을 수 있습니다.
  • refresh token : access token의 유효 기간 연장을 위한 토큰
    access token이 만료되었지만 refresh token으로 access token을 새로 발급받을 수 있게 해줍니다.
    refresh token 또한 사용자가 로그인하면서 발급받은 것입니다.
    따라서 요청의 refresh token이 유효하면 해당 사용자인 것으로 간주할 수 있습니다.

token을 한 가지만 사용할 수는 없는가?

  • 사용할 수 있습니다. 단, token은 expiry가 설정되어 있습니다.
    expiry가 지나면 token은 사라집니다.
    사용자가 서비스를 이용하다가 token expiry에 도달하면 이용에 문제가 발생할 수 있습니다.
  • 위와 같이 access token이 expired되면 refresh token으로 access token을 재발급 받아, 별도로 로그인을 다시 할 필요 없이 서비스를 정상적으로 이용할 수 있게 합니다.
    그래서 일반적으로 access token expiry < refresh token expiry 를 만족하게 설정합니다.

token의 유효 여부는 무엇으로 판단하는가?

  • token을 서버로 보내면 서버는 jwt 라이브러리의 복호화 로직을 사용하여 서명의 Secret을 확인합니다.
  • 복호화 한 데이터가 서버 DB에 저장된 token의 정보와 일치하는지 비교하여 판단합니다.

JWT 저장 DB : Redis

JWT는 간단하고 빠른 조회를 위해 no-sql, Non-Relational DB를 사용하는 게 좋습니다.
Redis는 비관계형 데이터베이스로, Key : Value를 한 세트로 하여 데이터를 관리합니다.
Redis에 Key : Value 형태의 Dictionary로 저장하면 값을 찾는 것도 빠릅니다.
JWT를 저장할 때 필요한 것은 Key, TTL, Value입니다.
TTL(Time to live)은 expiry이고, Redis는 expiry가 지나면 자동으로 해당 Key : Value를 제거합니다.

JWT를 사용했을 때의 로그인 및 API 사용 workflow를 살펴보았습니다.

다음 포스트에서는 JWT 보안에 대해 다루겠습니다.👍

profile
주니어 개발자

0개의 댓글