로그인 방식 (메모리 기반 DB에 저장하기 / JWT 사용하기 )

yiwoojung·2022년 8월 16일
0

General

목록 보기
3/5
post-thumbnail

1. 인증과 인가

최근들어 많이 사용하는 로그인 방식은 두가지가 있다.

1. 메모리 기반 데이터베이스(Redis) 사용하는 방식 

2. JWT 사용하는 방식

우선 로그인을 하기 위해서는 `인증`과 `인가`에 대해서 알아야한다.

로그인을 하게 되면 백엔드 컴퓨터에 로그인 정보를 저장한다(1번 방식일 때). 이때 로그인이 되면 토큰을 받아오게 되는데 이 과정인증이라고 한다.
그리고나서 이후에 API를 요청할 때 백엔드로 이 토큰을 보내게 되면 실제 이 유저가 그 유저가 맞는지 또는 만료기간이 남았는지 등을 확인하는데 이 과정을 인가라고 한다. (이때 문제가 생기면 프론트에 에러를 띄우는 것이고 성공을 하면 다음 요청을 실행하는 것이다.)
이런식으로 로그인의 인증과 인가가 이루어지는데 이때 JWT는 인증정보로 사용(2번 방식일 때)된다.

그렇다면 이제 메모리 기반 데이터베이스를 사용해서 로그인하는 방법을 알아보자.



2. 메모리 기반 데이터베이스 사용하는 방식

백엔드 컴퓨터에 인증정보가 저장되다 보면 백엔드 컴퓨터의 부하가 너무 증가하게 될 것이다. 이때 scale-up을 하다가 그래도 안되면 scale-out을 하게 된다. (트래픽 분산)

scale-up : 기기 성능 높이기
scale-out : 기기 수량 늘리기

이때 scale-out을 할때는 모든 컴퓨터가 로그인 상태를 가지고 있지 않아야 한다. (stateless) 그리고 이 메모리 세션을 DB가 가지고 있어야 한다.
이렇게 분리를 하고나니 누구나 로그인을 할 수 있게 되었다.
하지만 결국엔 이 방식도 결국 DB로 트래픽이 몰리게 되었고 병목현상(Bottle-neck)이 일어나 속도가 느려졌다. 이때 DB에 저장된 데이터의 크기가 너무 크기 때문에 그대로 scale-out을 할 수는 없었다. 그래서 나온 방법이 이 데이터베이스 테이블을 수평으로 나누거나 수직으로 나눌 수 있었는데, 이를 파티셔닝(나눠 담았다)이라고 한다. (그리고 주로 수평 파티셔닝 방식이 많이 사용되었는데 이를 샤딩이라고 부른다.)
이때 성능을 빠르게 하기 위해서는 이 데이터들을 메모리 기반 DB에 저장해야 하는데 대표적인 메모리기반 데이터베이스가 Redis로 Redis를 이용한 로그인 방식이라고도 한다.



트래픽이 몰리는 문제는 어떻게 해결하긴 했지만 결국에는 인가를 할 때 DB까지 가서 데이터를 꺼내와야 하는 어려움이 있었다.
그래서 이런 번거로움을 없애고 로그인 정보를 아예 메모리에도 저장하지 않는 방법이 뭐가 있을까? 하다가 두번째 방법이 나오게 되었다.



3. JWT 사용하는 방식

똑똑한 사람들이 로그인 정보를 DB에 가지 않고 바로 객체에 저장하면 어떨까? 라고 생각했다.

그래서 그 객체에 아이디와 만료기간을 적고 그것을 암호화하였고 그 결과값을 복호화해서 다시 원래의 객체를 가져올 수 있게 하였다.

이때 이 암호화한 토큰을 JSON WEB TOKEN(= JavaScript Object Notation Web Token,JWT) 제이슨웹토큰 이라고 하고 이를 accessToken 이라고도 한다.

브라우저로부터 이 accessToken을 받게되면 이는 아무 의미없는 토큰이 아니기 때문에 백엔드 DB까지 가지 않고도 백엔드에서 복호화를 통해서 브라우저에게 복호화된 객체를 넘겨줄 수 있는 것이다.


JWT 홈페이지 바로가기

profile
프론트엔드 개발자

0개의 댓글