Login Process

lynn·2022년 6월 9일
0

TIL

목록 보기
1/7

예전에 썼던 로그인 구현 방식과 개선된 방식 흐름 정리

<간단한 용어 정리>

인증(Authentication) : 로그인 등으로 사용자가 누구인지 확인하는 과정
인가(Authorization) : 로그인이 필요한 API를 요청할 때 로그인이 잘 됐는지 확인하는 과정, 즉 사용자가 API를 요청할 권한이 있는지 확인하는 과정이다.

세션을 이용한 로그인

로그인 인증(Authentication)

아이디,비밀번호를 입력한 뒤 로그인 버튼을 누르면 백엔드에서 입력한 정보를 데이터베이스에 있는지 확인한다. 정보가 있으면 세션에 저장하고 없으면 로그인이 되지 않는다.

로그인이 필요한 api 요청, 허가받기(Authorization)

로그인이 필요한 api를 요청할 때는 유저의 정보인 세션 ID를 메모리에 저장한 다음 백엔드에 넘긴다.
메모리에서 세션 id를 찾고 세션이 만료되지 않았다면 로그인을 할 수 있게 된다.
이때, api 응답을 받아 데이터를 db에 저장하게 된다.
만약 로그인이 안되어있거나 세션 시간이 만료되면 에러메세지를 띄우면서 api 요청을 할 수 없게 된다.

이때 세션 ID를 저장하는 방식이 시간이 지나면서 발전되어 왔다.

  1. 백엔드 컴퓨터에 세션 저장→사용량이 많아지면서 서버 부하→컴퓨터의 cpu,메모리 같은 성능을 올림(scale-up)

scale up으로도 서버 부하를 막을 수 없게 되자 백엔드 컴퓨터를 늘리기 시작했다.

  1. 유저 정보가 담긴 백엔드 컴퓨터를 복사하는 방식인 scale out

→하지만 복사할 때 세션도 모두 복사할 수 없기 때문에 한계가 있었다.

  1. 로그인 정보(세션)를 백엔드 컴퓨터가 아닌 DB에 저장하기 시작
    이때 세션은 백엔드 컴퓨터에 상태를 가지고 있지 않은 stateless이다.

DB 역시 컴퓨터이기 때문에 트래픽이 많아지면 DB 부하가 일어날 수 밖에 없다. 이를 해결하기 위해 DB partitioning 같은 방법이 있긴 하지만 db 접근 속도를 향상시키는데에는 한계가 있었다.

  1. DB 컴퓨터 속도를 개선하기 위해 Redis(메모리에 저장해두는 임시 데이터베이스)에 저장해두기 시작했다. 디스크가 아닌 메모리에 저장하기 때문에 속도가 훨씬 빨라질 수 있었다.


토큰을 이용한 로그인

Redis에서 그치지 않고 사람들은 더 좋은 방법을 찾기 시작했다. 로그인 정보를 백엔드 컴퓨터나 DB에도 저장하지 않고, '토큰'이라는 걸 만들어서 유저 정보를 관리하게 된다.

JWT (JSON Web Token)

유저 정보를 담은 객체를 문자열로 만들어 암호화한다. 이때 암호화된 키를 Access Token(액세스 토큰)이라고 한다. JWT는 JSON 형식으로 된 토큰 전달 방식이다.

그래서 로그인 인증 과정을 거치면 액세스 토큰이 생성되고, 인가가 필요한 api를 요청할 때 액세스 토큰을 HTTP Header에 첨부하게 된다. 이때 토큰을 복호화하면서 인가를 하게 된다.

인증은 로그인할 때 한번만 일어나고 API를 요청할 때마다 인가가 발생한다.
토큰 암호화, 복호화 과정은 프론트가 아닌 백엔드에서 담당한다.

  • JWT 특징
    - 토큰이 백엔드에 저장되어 있지만 누구든지 내용을 볼 수 있다.
    - jwo.io 링크를 접속해서 encoded에 토큰을 넣으면 정보를 확인할 수 있다.
    (header는 토큰 타입과 암호화 알고리즘 정보, payload는 토큰 발행 정보, signature는 비밀키를 담는다)
    - 비밀키를 가지고 있지 않아도 payload(데이터)를 열어볼 수 있기 때문에 조작을 할 수 있다는 위험성을 가지고 있다.
    - 데이터 조작 여부 확인은 백엔드가 담당한다.
    -> 따라서 매우 민감한 개인정보들은 JWT로 저장하면 안된다!
profile
개발 공부한 걸 올립니다

0개의 댓글