로그인 기능 구현 (feat. 로그인의 역사)

전은찬·2023년 2월 14일
0
post-thumbnail

웹에서 로그인 기능을 구현하기 위한 이론 몇가지를 적어본다.

로그인 방식 여러가지를 살펴보자.

브라우저에서 아이디와 비밀번호를 입력하여 백엔드로 API를 요청하고,
백엔드에서 해당 계정의 존재를 데이터베이스에서 확인한 후에 세션에 저장한다.
세션에 저장할 때 특정 id 값을 부여하여 식별을 가능케해준다.

세션 id를 불러오는 과정을 '인증', 세션 id를 백엔드로 보내주는 과정을 '인가' 라고 한다.

이러한 방식은 계정이 많아지면 많아질수록 메모리가 점점 부족해지는데, 이를 보완하기위헤 더 큰 메모리를 사용해야만 한다.
이러한 방식을 scale-up이라고 하는데 모든 정보를 옮기기에는 어려워서 좋은 방법이 아니다.

이 다음의 로그인 방식으로 메모리를 scale-up할 필요없이 같은 API를 가진 메모리를 여러개 가지게 된다.
계정 정보를 각 메모리마다 똑같이 가지고 있으니 로그인 요청시 여러 대를 나눠서 접속시키면 메모리를 분산시킬 수 있는 방법인 것이다.
그러나 이 방식은 복사시 세션까지 scale-out이 안되기때문에 메모리들끼리 로그인 정보를 서로 알지 못해 계정 활동의 에러가 발생하기 쉽다.
또 백엔드 메모리들이 여러개여도 데이터베이스는 하나이기때문에 병목현상이 일어나 부하가 일어난다.

scale-out과 병목현상이 없도록 데이터베이스에서 관리한다면?
이렇게 되면 데이터베이스를 복사하기에 비용적으로도 힘들고, 데이터를 쪼개서 관리한다고 한들 disk에 데이터들이 꽉차기때문에 disk i/o가 발생하여 느리다..

이 단점들을 보완하여 만든 방식으로
Redis 메모리라는 임시 데이터베이스에 인가가 필요한 API, 즉 세션id를 저장하고, 그 외의 정보들은 데이터베이스에서 가져와서 속도도 빠르다.
근래에 자주 쓰이는 로그인 방식 두가지 중에 한가지이다.

위의 이미지에 보이는 로컬스토리지, 세션스토리지, 쿠키는 무엇인가.
간단히 말하면 로컬스토리지는 브라우저를 종료한 후에 다시 켜도 정보가 남아있고,
세션스토리지는 브라우저를 종료하면 정보가 사라진다.
쿠키는 생명주기로 만료 날짜를 입력하면 그 날짜까지 유지되고, 만료 날짜를 설정하지 않으면 브라우저 종료시 사라진다.

그러면 남은 로그인 방식 한가지는 어떤 특징을 가지고 있나 살펴보자.

로그인 정보를 굳이 데이터베이스에 저장하지 않는 방식..
JSON WEB TOKEN, JWT 로그인 방식이다.
JWT토큰은 유저 정보를 담은 객체를 문자열로 만들어 암호화 한 후 암호화된 키인 accessToken을 브라우저에 전달해준다.

받아 온 암호화된 키는 브라우저 저장소에 저장해두었다가 필요한 API를 요청할 때 정보를 보내주면 백엔드에서 암호화의 반대인 복호화를 해서 사용자를 식별하고 접근을 가능케해준다.
복호화할 수 있다는 것은 누구든 정보를 읽을 수 있으니 중요한 정보는 적으면 안되고, 조작은 비밀번호를 입력해야 가능하다.
백엔드에서는 조작된 정보인지 아닌지를 검사하게 된다.

이러한 안정상의 문제로 우리는 추가로 양방향 암호화 방식과 단방향 암호화 방식을 알아야한다.
양뱡향 암호화는 복호화가 가능한 암호화 방식이고,
단방향 암호화(해싱)은 복호화가 불가능하게 암호화하는 방식을 몇번이고 반복해서 원래 정보가 무엇인지 알아내지 못하게 하는 방식이다.

로그인 기능 구현을 위해 알아두어야할 이론적인 부분이 많다.
이번 글에서는 실무에서 자주 쓰이는 로그인 방식이 되기까지의 역사를 알아보았다.

profile
no record no memory

0개의 댓글