Day-22 Login Process

이영주·2022년 6월 8일
0

홈페이지나 앱에는 대부분 로그인 기능이 들어있는데 전체적인 과정을 보면서 자세히 알아보자.

인증

브라우저에서 로그인을 할 때 email 및 password를 입력하면 백엔드 login api로 넘어가면서 DB에서 정보를 등록하고 정보가 있는지 확인을 한다.
로그인 정보가 있으면 로그인 정보와 만료시간 등을 지정하는 백엔드 메모리 세션에 들어가게 되고 이것을 받아 브라우저에 보여주게 되는데 이렇게 메모리 세션 정보를 받아오는 것인증이라고 한다.
📌 참고: DB에 있는 id와 메모리세션에 id 다르다.

인가

이렇게 로그인 정보를 받아온 후 로그인이 되고 상품등록을 한다고 가정할 때
이때부터 백엔드에 메모리 세션에서 받아온 id도 넘겨주어야 한다!
백엔드에서는 받은 id를 확인해서 만료시간이 언젠지, 이사람이 맞는지 로그인 확인이 되면
상품을 등록하게 하고 만료시간이 지나거나 로그인 되어있는 상태가 아니라면 에러메세지를 띄워준다.
이렇게 로그인을 검증하는 과정인가라고 부른다.

하지만 이렇게 메모리 세션에 저장을 하게 되면 사용량이 적은 곳에서 적용하긴 좋지만 사용량이 많을 경우에는 메모리가 부족해지면서 서버가 터지게 된다.

서버관리 용어 정리

  • cpu: 요청을 처리하는 일을 함
  • memory: 요청된 내용을 저장
  • scale up: 메모리 늘려주기
  • scale out: 요청 나누기(여러 백엔드 컴퓨터 실행)
  • stateful: 백엔드 컴퓨터가 상태정보를 가지고 있는 것
  • stateless: 상태정보를 없애주는 것

서버가 터지지 않기 위해 scale out을 하게되면 많은 요청들이 나눠지기는 하지만 메모리 세션도 각각 나눠져 상태정보가 다르기 때문에
메모리세션을 DB에 저장해주는 것이 아주 효율적이다.

하지만 DB에서도 접속량이 많기 때문에 해결하기 위해서는

  1. 수직으로 자르기(수직 파티셔닝)
  2. 수평으로 자르기(수평 파티셔닝, 샤딩)

두가지 방법을 사용했는데 이 방법도 시간이 오래걸려서

최근에는 다른 2가지 방식을 이용해서 로그인을 하는 추세이다.

1. redis에서 찾아오기

2. 토큰으로 확인

메모리 세션의 id 자체(=token)를 암호화한 뒤 필요할 때 복호화해서 사용하면 된다.

💡메모리 세션 id를 암호화한 것으로 보는고, 메모리 세션 내용을 복호화한 결과라고 본다.

암호화의 종류

  • 양방향 암호화: 암호화하고 복호화할 수 있다.
  • 단방향 암호화(hash): 암호화는 하는데 복호화는 하지 못한다.
    (우리가 비밀번호를 찾을때 비밀번호를 재설정하는 이유도 hash처리가 되어있기 때문에 전체 비밀번호를 알 수 없기 때문)

JWT

JWT란 Json Web Token으로 메모리 세션 내용을 객체화해서 암호화 한 것을 말한다.

JWT를 이용하여 DB에 따로 저장을 안하고 복호화해주는 방법만 안다면 간단하다!

백엔드에서 준 JWT를 global state에 넣어준다면 백엔드에서는 복화화해줄 키를 가지고
암호화 된 것을 풀어서 바로 로그인 인증과정인 인가를 거친다.

최종적으로 인증은 거의 한번만! 인가는 여러번!
즉 로그인해야 할수있는 것들이 많기 때문에 인가과정이 많은데 DB까지 가지않고 바로 복호화해서 확인할 수 있어서 매우 효율적인 방법이다.


💡accessToken : 로그인인증을 위해 필요한 것(JWT, 메모리세션 ID 등등 고유한 값)

로그인 정보를 보내 accessToken을 받은 결과

JWT로 받은 accessToken은 https://jwt.io/ 에서 자세한 내용이 확인 가능하다.

데이터부분에서 자세한 내용이 확인 가능하며 1시간 마다 로그인 정보가 만료됨이 확인된다.
(refreshtoken 이용해서 만료시간 늘리기 가능)

💡accessToken을 백엔드에 보내줄 때는 HTTP HEADERS"Authorization": "Bearer 토큰" 형식으로 작성해야한다!!

profile
= ["꼼꼼한", "프론트엔드 개발자"]

0개의 댓글