사용자는 서비스를 이용하기 위해 회원가입을 진행한다. 우리가 일반적으로 회원가입할 때 볼 수 있는 아래와 같은 포멧에 자신의 정보를 입력하고 '가입하기' 버튼을 누른다. 이 때 버튼을 누른 순간 프론트엔드는 입력된 정보들을 담아 백엔드로 가입 요청을 보낸다.

요청이 들어오면 백엔드는 DB에 해당 정보들을 저장한다. 그런데 이 때! 비밀번호를 바로 저장해버리면 해당 서비스의 개발자들이 사용자의 비밀번호를 언제든지 확인할 수 있으므로 개인정보가 유출될 수 있는 상황이 발생한다. 이를 방지하기 위해 백엔드에서는 단방향 암호화 방식을 사용하는데, 단방향 암호화도 해커가 표를 만들어 하나씩 시도하였을 때 뚫을 수 있으므로 중간에 salt값을 사용한다. salt값은 정수 뿐만아니라 소수도 들어갈 수 있는데, 현재 일반적인 웹 서비스들에서의 가장 좋은 방법은 이렇게 단방향 암호화(hash) + salt를 추가하여 그 결과를 저장하는 것이다. 나는 bcrypt 라이브러리 사용하여 비밀번호를 저장하였다.
이번엔 로그인 방식을 살펴보자. 사용자가 자신의 아이디와 비밀번호를 적어 로그인을 시도했을 때 프론트는 아이디와 비밀번호 정보를 담아 백엔드에게 로그인을 요청한다. 백엔드에서는 먼저 DB에 입력된 이메일이 존재하는지를 확인하여 서비스에 가입된 회원인지를 판별한다. 현재 비밀번호는 단방향 암호화 방식을 사용하여 암호화된 상태로 DB에 저장되어 있으므로 우리는 해당 회원이 입력한 비밀번호와 DB에 저장되어있는 암호화된 비밀번호를 가져와 복호화를 시도한다. 만약 복호화된 비밀번호와 입력된 비밀번호가 일치하다면 사용자의 로그인된 상태를 유지시켜주기 위하여 Refresh Token을 생성하여 응답할 브라우저의 쿠기에 저장해준다. 그리고 Access Token도 생성해주어 이 토큰을 프론트엔드 쪽으로 보내준다.
이렇게 되면 프론트엔드에서는 받은 Access Token을 사용하여 해당 회원이 로그인된 회원인지 아닌지 판별하는 데에 사용한다. (Refresh Token과 Access Token이 궁금하다면 여기에서 확인!)