관리 메뉴

거니의 velog

(21) JWT를 통한 회원 인증 시스템 구현하기 1 본문

React_백엔드 프로그래밍

(21) JWT를 통한 회원 인증 시스템 구현하기 1

Unlimited00 2024. 2. 21. 13:21

1. JWT의 이해

* 이 장에서는 우리가 만든 서버에 회원 인증 시스템을 구현해 볼 것이다. 이 시스템을 구현하기 위해 JWT라는 기술을 사용한다. JWT는 JSON Web Token의 약자로, 데이터가 JSON으로 이루어져 있는 토큰을 의미한다. 두 개체가 서로 안전하게 정보를 주고 받을 수 있도록 웹 표준으로 정의된 기술 중 하나이다.


(1) 세션 기반 인증과 토큰 기반 인증의 차이

* 사용자의 로그인 상태를 서버에서 처리하는 데 사용할 수 있는 대표적인 두 가지 인증 방식이 있다. 하나는 세션을 기반으로 인증하는 것이고, 다른 하나는 토큰을 기반으로 인증하는 것이다. 두 방식이 어떻게 다른지 한번 알아보자.


[1] 세션 기반 인증 시스템

* 세션을 기반으로 인증 시스템을 만든다는 것은 어떤 의미일까? 한마디로 쉽게 설명하면 서버가 '사용자가 로그인 중임을 기억하고 있다'라는 뜻이다.

* 세션 기반 인증 시스템에서 사용자가 로그인을 하면, 서버는 세션 저장소에 사용자의 정보를 조회하고 세션 id를 발급한다. 발급된 id는 주로 브라우저의 쿠키에 저장한다. 그 다음에 사용자가 다른 요청을 보낼 때마다 서버는 세션 저장소에서 세션을 조회한 후 로그인 여부를 결정하여 작업을 처리하고 응답을 한다. 세션 저장소는 주로 메모리, 디스크, 데이터베이스 등을 사용한다.

* 세션 기반 인증의 단점은 서버를 확장하기가 번거로워질 수 있다는 점이다. 만약 서버의 인스턴스가 여러 개가 된다면, 모든 서버끼리 같은 세션을 공유해야 하므로 세션 전용 데이터베이스를 만들어야 할 뿐 아니라 신경 써야 할 것도 많다.

* 그렇다고 해서 세션 기반 인증이 무조건 좋지 않은 것은 아니다. 잘 설계하면 충분히 좋은 시스템이 될 수 있다.


[2] 토큰 기반 인증 시스템

* 이번에는 토큰 기반 인증 시스템에 대해 알아보자. 토큰은 로그인 이후 서버가 만들어주는 문자열이다. 해당 문자열 안에는 사용자의 로그인 정보가 들어 있고, 해당 정보가 서버에서 발급 되었음을 증명하는 서명이 들어 있다.

* 서명 데이터는 해싱 알고리즘을 통해 만들어지는데, 주로 HMAC SHA256 혹은 RSA SHA256 알고리즘이 사용된다.

* 서버에서 만들어 준 토큰은 서명이 있기 때문에 무결성이 보장된다. 여기서 무결성이란 정보가 변경되거나 위조되지 않았음을 의미하는 성질이다. 사용자가 로그인을 하면 서버에서 사용자에게 해당 사용자의 정보를 지니고 있는 토큰을 발급해 주고, 추후 사용자가 다른 API를 요청하게 될 때 발급받은 토큰과 함께 요청하게 된다. 그러면 서버는 해당 토큰이 유효한지 검사하고, 결과에 따라 작업을 처리하고 응답한다.

* 토큰 기반 인증 시스템의 장점은 서버에서 사용자 로그인 정보를 기억하기 위해 사용하는 리소스가 적다는 것이다. 사용자 쪽에서 로그인 상태를 지닌 토큰을 가지고 있으므로 서버의 확장성이 매우 높다. 서버의 인스턴스가 여러 개로 늘어나도 서버끼리 사용자의 로그인 상태를 공유하고 있을 필요가 없다.

* 우리는 두 가지 시스템 중 토큰 기반 인증 시스템을 사용해 볼 것이다. 이 방식을 택한 이유는 인증 시스템을 구현하기 간편하고 사용자들의 인증 상태를 관리하기도 쉽기 때문이다. 앞으로의 실습은 다음 흐름으로 진행된다.