이번 글에서는 회원가입, 로그인, 로그아웃, 아이디 찾기, 비밀번호 찾기의 큰 그림을 그려볼 것이다.
특히 로그인과 로그아웃은 토큰 방식으로 설명할 것이다.
회원가입
간단하게 아이디, 비밀번호, 이메일 정도만 입력하는 것으로 하겠다.
2번 과정 이후 사용자의 민감한 정보는 서버에서 DB에 저장할 때 암호화는 필수적이다.
로그인
AccessToken은 비교적 RefreshToken보다 짧은 유효시간을 가지게 된다. 로그인 이후 모든 API 요청마다 AccessToken을 함께 서버로 전달하여 인가 과정을 거치게 된다.
RefreshToken은 AccessToken이 만료되었을 때 재발급을 위해 존재한다. 필자와 같은 경우엔 주로 Redis라는 인메모리 데이터베이스를 이용하여 RefreshToken을 보관한다.
이렇게 RefreshToken과 AccessToken을 활용한다면 로그인을 지속할 수 있다. 하지만 RefreshToken도 만료된다면 로그인을 다시 해서 토큰 발급을 받아야 한다.
로그인이 필요한 이유는 무엇일까?
거의 모든 서비스에서 로그인을 하게되는데 갑자기 궁금해졌다. 왜 로그인을 꼭 하게 하는걸까? 왜 필요할까?
로그인을 통해 서비스 사용자의 신원을 확인 할 수 있다.
이는 서비스에 민감한 정보가 있는 경우 로그인을 통해 신원이 확인된 유저만 접근을 할 수 있게 해준다. 이는 서비스가 허가되지 않은 사용자의 접근을 방지하고 데이터의 보안을 강화 할 수 있다.
개인화된 경험 제공
로그인을 하게되면 서비스의 사용자가 누군지 알 수 있게 된다. 서비스는 사용자의 서비스 활동 로그를 분석하여 사용자에게 개인화된 경험을 제공해 줄 수 있게 된다. 넷플릭스의 추천 시스템과 무신사의 추천 시스템등을 생각해 본다면 로그인 없이는 불가능 하다는 것이 와닿을 것이다.
구독 및 결제
이는 약간 동떨어진 얘기일 수 있지만 넷플릭스를 생각하다보니 구독 서비스와 같은 유료화 서비스에서 로그인이 없다면 정보 관리가 어렵지 않을까 생각이 들었다. 또한 기존 서비스에서 유료화 서비스가 제공된다면 결제를 한 유저와 아닌 유저를 구분하기 위해선 로그인을 통한 서비스 유저의 신원을 파악하는게 중요할 것이다.
로그아웃
유효한 로그아웃 요청이 들어온 경우 서버는
- 레디스에서 RefreshToken을 찾아와 삭제한다.
- 요청에 들어있는 AccessToken을 레디스에 저장하게 되는데 key는 AccessToken value는 "logout" 유효시간은 현재 AccessToken의 남은 유효시간을 설정한다. 이를 블랙리스트에 등록한다고 한다.
- 이후 서버는 요청이 들어올 때마다 필터에서 Accesstoken이 블랙리스트에 있는지 파악한다.
아이디 찾기
필자는 보통 회원가입시 이용한 이메일을 이용하여 아이디찾기 로직을 구현한다.
비밀번호 찾기
4번에서 볼 수 있다시피 비밀번호 찾기 요청에 성공했을 경우 기존 비밀번호를 알려주지 않고 비밀번호 변경 페이지로 이동하는 것을 볼 수 있다.
왜 비밀번호 찾기는 기존 비밀번호를 알려주지 않을까?
대부분의 경우 비밀번호와 같이 민감한 정보는 해시 함수등을 이용하여 암호화하여 저장한다. 이렇게 해시화 되어 저장된 정보는 복호화가 불가능하기 때문에 기존의 비밀번호를 알려주는데 어려움이 있다. 정말 만약 해시화된 값을 복호화하여 기존 비밀번호를 알려준다고 해보자. 이러한 경우엔 중간자 공격에 비밀번호가 탈취당할 위험이 있다. 그렇기에 대부분의 서비스에서 비밀번호 찾기 로직에는 결국 기존 비밀번호를 변경하게 한다.
스프링부트에서 비밀번호를 DB에 저장할때 PasswordEncoder를 사용하게 되는데 PasswordEncoder는 복호화가 불가능하게 설계된 단방향 해시함수를 제공하기 때문에 안전하게 DB에 비밀번호를 저장할 수 있다.
'IT 공부' 카테고리의 다른 글
HTTP의 특성 (0) | 2024.01.08 |
---|---|
간단 보안! (feat. HTTPS 와 SSL/TLS 그리고 CSRF와 XSS) (1) | 2024.01.08 |
REST와 GraphQL (2) | 2024.01.08 |
회원 데이터베이스를 어떻게 짜볼까? (1) | 2024.01.08 |
인증(Authentication)과 인가(Authorization) (0) | 2024.01.07 |