웹사이트나 앱을 개발하더라도, 회원 기능은 거의 필수적으로 구현해야 하는 핵심 기능 중 하나이다. 최근에 강의를 듣고 있는데, 강사분께서도 회원 인증 시스템의 중요성을 강조하셨다. 오늘은 현재 가장 널리 사용되는 JWT(Jason Web Token) 인증 방식에 대해 배운 내용을 기록하려고 한다. JWT에 대해 자세히 알아보기 전에, 세션(Session)과 토큰(Token)의 기본 개념에 대해 먼저 기록하겠다.
Session & Token란?
Horizontal Scaling : 수평 확장 , 컴퓨팅 시스템에서 성능과 처리 능력을 늘리기 위해 사용되는 방법으로 서버, 데이터베이스, 애플리케이션 또는 다른 컴퓨팅 리소스를 복제하여 시스템의 처리 능력을 향상시키는 방식을 의미한다.
Vertical Scaling : 수직 확장 , 컴퓨터 시스템의 성능을 향상시키기 위한 방법 중 하나로, 주로 단일 서버 또는 가상 머신의 리소스를 업그레이드하여 처리 능력을 높이는 것을 의미한다.
Session의 생성 & 사용 방식
Token의 생성 & 사용 방식
JWT란?
JWT란 무엇일까? Json Web Token의 약자로 Header,Payload,Signature로 이루어져 있으며 base64로 인코딩 되어있다. 하나씩 정리해보겠다.
기본적인 구조는 xxxxx[Header].yyyyy[Payload].zzzzz[Signature] 되어잇다.
{
"alg": "HS256",
"typ": "JWT"
}
토큰의 종류와 암호화 알고리즘등 토큰에 대한 정보가 들어있다.
{
"sub": "1234567890",
"name": "Pyo",
"iat": 1516239022
}
발행일,만료일,사용자 ID등 사용자 검증에 필요한 정보가 들어있다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
flutterPyo
)
Base64 인코딩된 Header,Payload를 알고리즘으로 싸인한 값이 들어있다.이 값을 기반으로 토큰이 발급된뒤로 조작되었는지 확인할 수 있다.
JWT의 구조를 테스트 해보기 위해 https://jwt.io/ 에서 확인 해보겠다.
Refresh Token & Access Token
Refresh Token : JWT 기반 토큰으로 Access Token을 추가로 발급할때 사용된다. Access Token을 새로고침하는 기능이 있으며 , 긴 유효기간으로 Access Token을 재발급 받을때만 사용되기 때문에 상대적으로 노출이 적으며 탈취가능성이 적다.
Access Token : JWT 기반 토큰으로 Access Token은 API요청 할때 검증용 토큰으로 사용된다. 인증이 필요한 API를 사용할때는 꼭 Access Token을 Header에 넣어서 보낸다. Access Token은 유효기간을 짧게 해서 Token이 탈취되어도 해커가 오래 사용하지 못하도록 방지할 수 있다.
일반적으로 토큰을 발급 할때 , 클라이언트에서 서버로 username:password 값을 base64로 인코딩후 Header에 authorization : "Basic $token" 형태로 전송한다. 발급된 Refresh Token과 Access Token은 어떻게 사용되는지 알아보자.
Refresh Token은 만약 Access Token이 만료가 되면 , 클라이언트에서 API서버로 Access Token 재발급 요청을 Header에 authorization : "Bearer $refreshToken" 형태로 전송하여 API서버에서 Access Token재발급하여 클라이언트로 다시 전송한다.
Acccess Token은 클라이언트에서 API서버로 특정한 요청을 Header에 authorization : "Bearer $AccessToken"을 전송하여 API서버에서 토큰 검증후 , 데이터 베이스로 특정한 요청을 통하여 받은 데이터를 클라이언트로 전송한다.
클라이언트에서 API서버로 Access Token을 이용해 특정 요청을 보낸다 . API서버에서 Access Token 검사시, Access Token이 만료 되었다면 클라이언트로 만료 응답을 보낸다. 클라이언트는 API서버로 Access Token을 재발급 하기 위하여 Refresh Token을 전송하여 새로운 Access Token을 재발급 받게된다. 재발급 받은 Access Token을 이용하여 API서버로 특정한 요청을 다시 보낸다. API서버에서 확인 후 Access Token이 이상이 없을 경우, 데이터 베이스에서 특정한 요청에 대한 데이터를 가져와 클라이언트로 전송한다.
https://www.inflearn.com/course/%ED%94%8C%EB%9F%AC%ED%84%B0-%EC%8B%A4%EC%A0%84/dashboard
https://www.daleseo.com/jwt/