코드캠프 부트캠프 22일차

개발일기·2022년 2월 14일
0

로그인 프로세스

초기의 로그인 프로세스 방식

  1. 사용자가 브라우저에서 백엔드로 email과 password를 전송한다.
  2. 백엔드 컴퓨터에서 Login API를 받게되면 해당하는 DB를 찾는다.
  3. 백엔드 컴퓨터 메모리에 로그인 상태를 저장한다.(Session에 저장한다)
  4. 그 후 백엔드 컴퓨터에서 브라우저(유저)한테 암호화된 문자열을 보내준다.
  5. 유저가 로그인 권한이 필요한 서비스(결제, 프로필 업데이트 ...)을 실행할 때 백엔드 컴퓨터에 암호화된 문자열을 포함한 email과 password를 보낸다.
  6. 백엔드 컴퓨터에서 받은 암호화된 문자열이 상용자가 일치하면 해당 서비스를 진행한다.

하지만 서비스가 많아지고 유저가 증가함에 따라 백엔드 컴퓨터에서 처리해야 하는 api가 점차 증가하게 되면서 백엔드 컴퓨터의 cpu와 memory의 스펙을 높여나갔는데, 이를 Scale-up이라고 한다.

하지만 Scale-up만으로도 서비스가 원활히 진행이 되지 않게되어 같은 api를 가지고 있는 백엔드 컴퓨터를 복사하여 서비스를 진행하는 것을 Scale-out이라고 한다.
여기서도 문제가 일어난다. 백엔드 컴퓨터를 복사하더라도 백엔드 컴퓨터의 메모리(Session)에 로그인 여부의 상태가 저장되어 있기 때문에 '철수'라는 사람이 백엔드 A 컴퓨터에 로그인상태가 저장되어 있는데 백엔드 B 컴퓨터에 요청을 하게 될 경우 로그인 후 가능한 서비스들을 이용 못하게 된다.
그래서 메모리(Session)에 로그인 상태를 저장하지 않고, DB컴퓨터에 로그인 상태를 저장하였고 이를 통해 Scale-out을 가능하게 했는데 이를 Stateless 되었다고 한다.
하지만 이는 백엔드 컴퓨터로 몰리던 접속량이 DB로 옮겨졌을 뿐, 근원적인 문제가 해결되지 않았다.
DB의 경우에는 복제를 하는데 매우 많은 용량과 비용이 요구되기 때문에 복제하는것이 쉽지 않아 나오게 된 방법이 데이터 파티셔닝이다. 테이블 형태의 데이터베이스를 가로로 자르는 것을 수평 파티셔닝(데이터베이스 샤닝)이라 하고 세로로 자르는 것을 수직파티셔닝 이라 한다. DB에 저장한다는 것은 Memory가 아니라 Disk에 저장하게 되는 것으로 안전하지만 속도가 느리다는 단점이 있다. 그래서 DB와 백엔드 컴퓨터 사이에 Memory저장 방식인 Redis를 사용하게 되면 처음에 로그인을 하면서 받은 암호화된 문자열을 브라우저의 cookie, state, localstorage, sessionstorage와 같은 memory에 저장시키고, 문자열이 필요한 서비스를 사용할 때 같이 보내는 방식을 사용하게 된다.

이 후 브라우저에서 이메일, 패스워드를 입력하여 백엔드로 해당 데이터들을 보내고, 백엔드 컴퓨터에서 DB에서 해당하는 데이터가 있는지 확인한 후에 있다면 백엔드 컴퓨터에서 로그인 만료시간을 포함한 자바스크립트의 객체형태의 문자열(JSON)형식으로 저장하고 이를 암호화하여 이 암호화된 문자열을 토큰으로 보내주게 된다. 객체 형태의 문자열로 받은 암호화된 문자열을 JWT토큰이라고 한다. 이렇게 된다면 백엔드 컴퓨터에서 암호화된 문자열을 복화하 하였을 때 로그인 만료시점이 포함되어 있다면, 이미 로그인이 되어 있는 상태라고 확인을 할 수 있기 때문에 DB가 없어도 로그인 여부를 확인할 수 있게 된다.

로그인을 통해 토큰을 얻는 과정을 인증(Authentication)과정 이라하고 이렇게 얻은 토큰을 활용하여 여러가지 권한을 얻는 것을 인가(Authorization)이라 한다.

profile
개발자가 꿈이에오

0개의 댓글