비밀번호 찾기 로직에 대한 생각
Goal
웹페이지에서 비밀번호를 찾는 방법에 대해 천천히 생각해보자.
왜
내가 인증이 필요한 웹 서비스를 사용할 때 주된 서비스 말고 가장 많이 사용해본 것은 "비밀번호 찾기"이다. 매번 하던 비밀번호를 하면 보안이 우려되고, 아예 새로운 비밀번호를 설정하면 언젠간 "비밀번호 찾기" 서비스를 이용하게 된다.
아마 다른 사람들도 비슷하지 않을까?
여러 서비스를 찾아봤다. 아니 찾아보지 않아도 자연스레 자주 사용하게 됐다. 엄밀히 말하면 "비밀번호 찾기"보다는 "비밀번호 새로 설정하기"가 맞겠다.
어떻게
몇 가지 서비스를 둘러봤다.
네이버
회원정보에 등록한 휴대전화 또는 이메일로 인증을 한다.
휴대전화로 해봤는데 인증번호를 받았고 웹페이지에 입력하니 새 비밀번호를 설정하는 페이지로 이동시켜준다.
해당 페이지 URL에는
token_help
라는 query string이 있었다. 이게 내가 인증을 완료했다고 식별해주는 듯 하다. 이 URL을 꼭 쥐고 있다가 10분 뒤에 접속해봤다. 잘 되었다. 아마 다른 서비스처럼 몇 시간일 것 같다!
다음
다음 계정은 카카오와 통합되었다. 그래서 카카오 비밀번호 찾기를 했다.
- 이메일 인증을 해봤다.
- 이메일 인증이어서 그런지 추가 확인을 진행햇다. 전화번호를 입력하라고 한다.
- 전화번호는 인증번호를 확인하진 않고 맞는지만 확인한다.
- 새 비밀번호를 설정하는 페이지로 이동시켰다.
- URL에 토큰같은건 보이지 않았다. 그래서 복사해봤자 다른 창에서 URL에 접속해도 유효하지 않았다.
- 개발자도구를 열어보니 cookie가 정말 많던데 그걸로 사용자를 식별하는 것일 수 있겠다.
구글
- 휴대전화로 인증 코드를 받고 진행한다. 앱을 사용하는 방법도 있다.
- 휴대전화 인증 코드를 입력하니 인증 코드가 포함된 메일을 계정에 설정된 다른 메일로 보낸다.
- 이 인증 코드는 누구에게도 전달하거나 제공하면 안 된다고 경고한다.
- 놀랍게도 비밀번호를 변경하지 않고 그냥 로그인이 된다.
- 그리고 비밀번호를 변경할 수 있는 페이지로 이동해 "비밀번호 진단"을 안내한다.
- 무슨 의도일까? 비밀번호 상태를 진단받을 수 있게 함일까...
STEAM
- 이메일 또는 휴대전화 번호를 입력하라고 한다.
- 이메일로 했다.
- verification link가 메일로 전송된다.
- URL에
VerifyCode
가 포함되어 있다.
- URL에
- 새 비밀번호를 설정하는 페이지가 열린다. (17:27)
Github
- 이메일을 입력하라고 한다.
- 비밀번호를 초기화할 수 있는 Link가 메일에 전달된다.
- 친절하게도 해당 Link는 3시간 뒤 만료된다고 안내되어 있다.
- URL에 token처럼 보이는 parameter가 포함되어 있다.
Netflix
- 이메일 주소 또는 SMS로 재설정 안내 메일을 보낸다고 한다.
- 재설정 메일에 링크를 클릭하면 로그인이 되고 새 비밀번호를 생성하라는 메시지가 표시된다.
- 링크는 24시간 후에 만료된다고 한다. 만료된 경우 다시 메일이 전송된다고 한다. Watcha
- 이메일로 재설정 메일이 발송된다.
- 비밀번호 변경 링크 URL에는 token처럼 보이는 것이 포함되어 있다.
- 새 비밀번호를 설정하는 페이지가 나온다.
결론
충분히 살펴본 것 같다. 대부분 휴대전화와 이메일로 인증 코드를 전송하는 방식이다. 휴대전화로 가입하지 않는 서비스는 휴대전화로 비밀번호 찾는 기능은 굳이 넣지 않은 것 같다.
내 생각에 휴대전화 인증이 아닌 경우 이메일이라면 굳이 이메일로 인증 코드를 받고 그 코드를 웹에서 입력하는 것은 상당히 번거로운 것 같다. 링크를 전달해서 바로 열어주는 것이 간편해보인다. 중요한 것은 보안을 위해 해당 링크의 만료기간을 설정하는 것이다!
그리고 해당 인증 코드가 만료되는 시간을 메일이나 페이지에 명시해주는 것이 사용자에게 도움이 된다. 해커 입장에도 도움이 될 것 같다
살펴본 것을 종합해서 다음 로직을 생각해볼 수 있었다.
- 비밀번호를 찾기 위해 메일을 요청에 담아 보낸다.
- 서버에서는 해당 email이 유효한지 확인한다. 유효하다면 token을 생성한다.
- token이 DB에 저장된다.
- token이 포함된 링크를 메일에 포함해 전달한다.
- 해당 링크에 접속하면 새 비밀번호를 입력할 수 있는
form
이 있다. - 새 비밀번호를 token과 함께 전송한다.
- 서버에서 token의 유효성을 검증한다. (만료시간 & DB 데이터 확인)
- token이 유효하다면 비밀번호를 변경한다.
- token도 DB에서 삭제한다.
추가로, 사용자를 강제로 로그아웃시킬 수 있다면 그렇게 해야겠다. 비밀번호가 변경되었기 때문에 유효하지 않은 인증이라 볼 수 있기 때문이다.