JWT & 토큰 인증 시스템

Pyo·2023년 9월 16일
0
post-thumbnail

웹사이트나 앱을 개발하더라도, 회원 기능은 거의 필수적으로 구현해야 하는 핵심 기능 중 하나이다. 최근에 강의를 듣고 있는데, 강사분께서도 회원 인증 시스템의 중요성을 강조하셨다. 오늘은 현재 가장 널리 사용되는 JWT(Jason Web Token) 인증 방식에 대해 배운 내용을 기록하려고 한다. JWT에 대해 자세히 알아보기 전에, 세션(Session)과 토큰(Token)의 기본 개념에 대해 먼저 기록하겠다.

Session & Token란?

Session : 유저의 정보를 데이터베이스에 저장하고 상태를 유지하는 도구이다.

  • Session은 특수한 id 값으로 구성
  • Session은 서버에서 생성되고 클라이언트에서 쿠키로 저장
  • 클라이언트에서 요청을 보낼때 , Session ID를 같이 보내면 현재 요청을 보내는 사용자가 누구인지 서버에서 알 수 있다.
  • Session ID는 데이터 베이스에 저장되기 때문에 요청이 있을때 마다 매번 데이터 베이스를 확인해야한다.
  • 서버에서 데이터가 저장되기 때문에 클라이언트에서 사용자 정보가 노출될 위험이 없다.
  • 데이터 베이스에 Session을 저장해야 하기 때문에 Horizontal Scaling이 어렵다.

Token : 유저의 정보를 Base 64로 인코딩된 String값에 저장

  • Token은 Header,Payload,Signature로 구성되어 있으며 Base 64로 인코딩 되어 있다.
  • Token은 서버에서 생성되고 클라이언트에서 저장
  • 클라이언트에서 요청을 보낼때 Token ID를 같이 보내면 현재 요청을 보내는 사용자가 누구인지 서버에서 알 수있다.
  • Token은 데이터 베이스에 저장 되지 않고 Signature값을 이용해서 검증할 수 있다. 그래서 검증할때 마다 매번 데이터 베이스를 들여다 볼 필요가 없다.
  • 정보가 모두 토큰에 담겨 클라이언트에서 토큰을 저장하기 때문에 정보 유출의 위험이 있다
  • 데이터 베이스가 필요없기 때문에 Horizontal Scaling이 쉽다.

Horizontal Scaling : 수평 확장 , 컴퓨팅 시스템에서 성능과 처리 능력을 늘리기 위해 사용되는 방법으로 서버, 데이터베이스, 애플리케이션 또는 다른 컴퓨팅 리소스를 복제하여 시스템의 처리 능력을 향상시키는 방식을 의미한다.

Vertical Scaling : 수직 확장 , 컴퓨터 시스템의 성능을 향상시키기 위한 방법 중 하나로, 주로 단일 서버 또는 가상 머신의 리소스를 업그레이드하여 처리 능력을 높이는 것을 의미한다.

Session의 생성 & 사용 방식

세션의 생성

  1. 클라이언트에서 API서버로 id,password 를 전송한다.
  2. API서버에서는 데이터 베이스에 id,password를 검증을 한다.
  3. 검증결과가 맞다면 , API서버에서 id에대한 세션을 생성해서 데이터 베이스에 저장한다.
  4. 생성된 세션은 쿠키형태로 클라이언트로 전송이 된다.

세션의 사용

  1. 클라이언트에서 API서버로 특정한 요청과 쿠키를 전송한다.
  2. API서버에서는 쿠키의 세션이 정상인지 검증을한다.
  3. API서버는 해당 세션의 id에 대한 정보를 데이터베이스로부터 검색을한다.
  4. 세션의 id가 맞다면,처음에 클라이언트에서의 특정한 요청에대한 데이터를 데이터베이스에서 API로 받아온다.
  5. 받아온 데이터를 API서버에서 클라이언트로 전송 한다.

Token의 생성 & 사용 방식

토큰의 생성

  1. 클라이언트에서 API서버로 id,password 전송한다.
  2. API서버에서는 데이터 베이스에 id,password를 검증을 한다.
  3. 검증결과가 맞다면 , 데이터베이스에 저장하지 않고 API서버에서 id에대한 토큰을 생성을하고 바로 클라이언트로 전송한다.

토큰의 사용

  1. 클라이언트에서 API서버로 특정한 요청과 토큰을 전송한다.
  2. API서버에서는 토큰이 정상인지 검증을한다. 해당 토큰의 id에 대한 정보를 데이터베이스로 검색하지 않아도된다.토큰안에 id가 들어있기때문이다.
  3. 특정한 요청에대한 데이터를 데이터베이스에서 API로 받아온다.
  4. 받아온 데이터를 API에서 클라이언트로 전송 한다.

JWT란?

JWT란 무엇일까? Json Web Token의 약자로 Header,Payload,Signature로 이루어져 있으며 base64로 인코딩 되어있다. 하나씩 정리해보겠다.

JWT 구조

기본적인 구조는 xxxxx[Header].yyyyy[Payload].zzzzz[Signature] 되어잇다.

{
  "alg": "HS256",
  "typ": "JWT"
}

토큰의 종류와 암호화 알고리즘등 토큰에 대한 정보가 들어있다.

PayLoad

{
  "sub": "1234567890",
  "name": "Pyo",
  "iat": 1516239022
}

발행일,만료일,사용자 ID등 사용자 검증에 필요한 정보가 들어있다.

Signature

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 사용 과정

Refresh Token은 만약 Access Token이 만료가 되면 , 클라이언트에서 API서버로 Access Token 재발급 요청을 Header에 authorization : "Bearer $refreshToken" 형태로 전송하여 API서버에서 Access Token재발급하여 클라이언트로 다시 전송한다.

Access Tokne 사용 과정

Acccess Token은 클라이언트에서 API서버로 특정한 요청을 Header에 authorization : "Bearer $AccessToken"을 전송하여 API서버에서 토큰 검증후 , 데이터 베이스로 특정한 요청을 통하여 받은 데이터를 클라이언트로 전송한다.

일반적인 Access Token Refresh Token 사용하는 인증로직

클라이언트에서 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/

0개의 댓글