안녕하세요, 주니어 개발자 Eon입니다.
이번 글에서 다룰 내용은 JWT가 사용되는 순서입니다.
JSON Web Token 인증 수단입니다. 토큰으로 해당 요청이 유효한지 확인할 수가 있습니다.
먼저 살펴볼 것은 JWT가 없는 경우입니다.
일반적인 간단한 로그인은 다음과 같이 이루어집니다.
A라는 사용자가 서비스에 접근을 원합니다.
A는 우리 서비스에 가입이 승인된 사용자입니다.
A는 정상적으로 우리의 서비스를 이용할 수 있습니다.
B라는 사용자 서비스에 접근을 원합니다.
B는 우리 서비스에 가입 승인이 되지 않은 사용자입니다.
B는 정상적으로 우리의 서비스를 이용할 수 없습니다.
로그인을 할 때 사용자의 ID와 PWD를 서버로 보내고, 서버는 DB 조회를 통해 해당 사용자가 승인이 된 사용자인지 검증합니다.
검증된 사용자라면 '로그인 성공', 검증에 실패한 사용자라면 '로그인 실패' 응답을 보냅니다.
로그인을 한 사용자는 서비스를 이용할 수 있습니다.
Q: 정말 로그인을 한 사용자만 서비스를 이용할 수 있나?
A: 아닙니다. Request API URI, body와 구성 헤더를 알면 로그인을 하지 않아도 서버에 요청을 보낼 수 있습니다.
여기서 우리의 서비스 구성을 가정합니다.
사용자 <---> 계정 관리 및 REST-API 서버 (로그인)
우리가 원하는 로직은 이러합니다.
사용자는 로그인을 하고, 로그인된 사용자에 한해서 REST-API를 이용하여 서비스를 제공받습니다.
위에서 이야기한 대로 지금 우리의 서비스 구성에서는 로그인을 한 유저가 보낸 요청인지, API URI로 직접 Request한 케이스인지 확인할 수 있는 방법이 없습니다.
그래서 JWT를 사용합니다.
JWT를 사용하면 다음과 같이 구성할 수 있습니다.
로그인 성공 시, JWT 인증 성공 시입니다.
(실패 시에는 실패 응답이 반환됩니다.)
사용자 | ===== ID / PWD ====> 계정 관리 및 REST-API 서버 (로그인)
| <======= JWT ======= 로그인 성공 시, JWT 발급
| ==== 요청 + JWT ====> JWT 인증 성공 시, REST-API 요청
다음의 Workflow를 확인합니다.
(※그림은 직접 그렸으며, 영리 목적으로 사용되는 걸 금지하고, 사용 시 출처를 명확히 밝혀 주시기 바랍니다.)
이 그림의 위 내용을 모두 이해한 사람이 이 그림에서 의문을 가질 수 있는 내용들입니다.
access token, refresh token이 무엇인가?
token을 한 가지만 사용할 수는 없는가?
token의 유효 여부는 무엇으로 판단하는가?
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 보안에 대해 다루겠습니다.👍