로그인 LogIN

내승현·2022년 4월 12일
0

백엔드의 메모리세션(변수)에 저장되어있었음 (아이디 , 이름 , 로그인 기간 등)
이것들을 구별하기 위한 아이디 -> 세션 아이디 -> 브라우저에 던져준다.

백에드에서는 브라우저에서 쓰인 세션 아이디를 가지고 결제를 진행하거나 상품 등록을 할때 확인한다.

이런식으로 메모리 세션에 저장되고 있다.

그러면 다른 브라우저에서도 로그인 요청을 한다면 로그인 데이터는 쌓이게 된다. 그렇다면 세션도 채워진다.

순서대로 하나씩 처리한다.
이것들은 자동으로 저장되는 것이 아니라 모아놓고 순차적으로 저장해야함 -> 메모리 - 즉, 램에 저장한다.

메모리 8기가를 > 16기가로 = scale up (수직으로 메모리 끌어올림)

또 다른 컴퓨터에 소스 복사/ 붙여넣기 부하 분산을 시킴 (수평으로 나눔) = scale out

백엔드에서 상태를 포함 - stateful

상태가 없음 - stateless

그렇다면 stateless 상태 일 때 어떻게 로그인을 편하게 할까 ?


로그인 정보를 어디에 저장할까 ?

ex) 데이터베이스에 저장 - id , name , date

수많은 데이터를 위해 db를 늘리는 것은 비효율적

이 db를 어떻게 해서 늘리는게 효율적일까 ?

id , name , getdate 있는 테이블을 나누자 !

데이터 베이스 테이블 나누기


api 하나하나 요청할때 누가 로그인 되어있는지 찾아와야함 - 로그인 되어있으면 - 상품 등록
ㄴ 영구 저장 공간에 저장 (디스크)
저장도 느리고 처리도 느리다 => "db를 긁는다"고 표현한다.

1. 메모리 기반 데이터베이스에 저장 - Redis

디스크 대신에 메모리 기반 데이터 베이스에 저장 - 메모리에 저장하는 것이기 때문에 굉장히 빠르다.

2. 네임과 만료일(객체)만 넣어놓고 암호화 하기 - 비밀번호처럼

=> 알 수 없는 문자열 형태로 바뀜
즉 암호화 했던 내용을 복호화하면 데이터가 들어가 있을것

=> 마치 db에 안갔지만 간 것 처럼 !!

암호화한 내용 = > 토큰 => JWT토큰
JWT토큰 - 자바스크립트 객체 표기법


JWT 토큰 사용법

로그인(이메일,비밀번호)을 한다 - 그럼 db에서 철수가 맞는 지 확인 - 객체 형태로 토큰을 만든다 - 이것을 암호화 시킨다 - 암호화 된 토큰을 프론트엔드에게 줌 - 브라우저에선 state에 저장을 하고 백엔드에게 요청 - 상품 정보 + 토큰(JWT) 아이디를 넘겨줌 - 백엔드에서 복호화 하면 암호화한 토큰 속 객체(데이터)를 확인

=> 이 과정을 하면 db를 긁을 필요가 없어짐
=> 효율적으로 바뀌었다 ~

encoded - 암호화
decoded - 복호화


createuser

LoginUser

JWT

JWT토큰은 누구든지 내용을 볼 수 있으나 조작은 불가 - 중요한 정보를 저장하면 안됨(ex- 계좌번호 , 포인트 등 )

  • 조작여부 판단 가능 (verify signature(서명된 내용)으로 판별)

암호화 2가지 방식

1.양방향 암호화

  • JWT토큰 - 복호화 가능

2.단방향 암호화(Hash)

  • 특정비밀번호를 암호화하게 되면 그 암호를 다시 복호화 할 수 없음 , 즉 암호화만 가능

fetchUserLoggedIn - HTTP HEADERS에 토큰 추가

인증 - Authentication ( email , password 등 로그인 )
인가 - Authorization (상품 결제 , 등록 Api 등을 사용할 때 accessToken을 HTTP HEADERS에 주면 복호화함 )


profile
아토언니의 성장기 ,,

0개의 댓글