예전에 썼던 로그인 구현 방식과 개선된 방식 흐름 정리
<간단한 용어 정리>
인증(Authentication) : 로그인 등으로 사용자가 누구인지 확인하는 과정
인가(Authorization) : 로그인이 필요한 API를 요청할 때 로그인이 잘 됐는지 확인하는 과정, 즉 사용자가 API를 요청할 권한이 있는지 확인하는 과정이다.
아이디,비밀번호를 입력한 뒤 로그인 버튼을 누르면 백엔드에서 입력한 정보를 데이터베이스에 있는지 확인한다. 정보가 있으면 세션에 저장하고 없으면 로그인이 되지 않는다.
로그인이 필요한 api를 요청할 때는 유저의 정보인 세션 ID를 메모리에 저장한 다음 백엔드에 넘긴다.
메모리에서 세션 id를 찾고 세션이 만료되지 않았다면 로그인을 할 수 있게 된다.
이때, api 응답을 받아 데이터를 db에 저장하게 된다.
만약 로그인이 안되어있거나 세션 시간이 만료되면 에러메세지를 띄우면서 api 요청을 할 수 없게 된다.
이때 세션 ID를 저장하는 방식이 시간이 지나면서 발전되어 왔다.
scale up으로도 서버 부하를 막을 수 없게 되자 백엔드 컴퓨터를 늘리기 시작했다.
→하지만 복사할 때 세션도 모두 복사할 수 없기 때문에 한계가 있었다.
DB 역시 컴퓨터이기 때문에 트래픽이 많아지면 DB 부하가 일어날 수 밖에 없다. 이를 해결하기 위해 DB partitioning 같은 방법이 있긴 하지만 db 접근 속도를 향상시키는데에는 한계가 있었다.
Redis에서 그치지 않고 사람들은 더 좋은 방법을 찾기 시작했다. 로그인 정보를 백엔드 컴퓨터나 DB에도 저장하지 않고, '토큰'이라는 걸 만들어서 유저 정보를 관리하게 된다.
유저 정보를 담은 객체를 문자열로 만들어 암호화한다. 이때 암호화된 키를 Access Token(액세스 토큰)이라고 한다. JWT는 JSON 형식으로 된 토큰 전달 방식이다.
그래서 로그인 인증 과정을 거치면 액세스 토큰이 생성되고, 인가가 필요한 api를 요청할 때 액세스 토큰을 HTTP Header에 첨부하게 된다. 이때 토큰을 복호화하면서 인가를 하게 된다.
인증은 로그인할 때 한번만 일어나고 API를 요청할 때마다 인가가 발생한다.
토큰 암호화, 복호화 과정은 프론트가 아닌 백엔드에서 담당한다.