클라이언트가 회원가입 화면에서 이메일 입력란에 문자열을 채우고 옆에 ‘인증 코드 받기’ 버튼을 누르면 서버의 이메일 인증 코드 발급 API가 호출됨.
서버의 이메일 인증 코드 발송 API는 인증 코드 (6자리 랜덤 숫자)를 생성하고, Redis에 저장함.
키 : email-code:[이메일]
값 : [인증코드]
(TTL : 5분)
⇒ 원래는 인증 코드가 더 짧아서 키에 넣으려고 했는데, 키 중복 문제 때문에 그냥 이메일을 키에 넣기로 함. (물론 인증 코드를 키에 넣고, 중복된 값이 나오지 않도록 체크해도 되기는 하지만, 병렬 시스템에서는 중복 검사가 복잡해지고, 괜히 번거롭기만 함. 그냥 이메일을 키로 쓰는 게 관리 면에서 훨씬 편함)
클라이언트는 이메일에 들어가서 인증 코드를 확인하고, 회원 가입 페이지에서 인증 코드란에 입력함.
서버에 **{이메일, 인증 코드}**를 넘기면서, 이메일 인증 코드 검증 API가 요청됨.
서버의 이메일 인증 API는 Redis에서 인증 코드를 기반으로 키 검색하고, 값이 입력 받은 이메일과 일치하는지 확인함.
인증 코드가 유효하면 Redis에서 인증 코드 정보를 삭제하고, 이메일 인증 state (UUID로 생성)를 Redis에 저장함.
키 : state:[uuid]
값 : [인증한 이메일]
(TTL : 10분)
⚠️ 주의 : 올바른 state인지 검사하려면 uuid와 이메일 모두 확인해야 함.
이메일 인증 성공 메세지와 함께 이메일 인증 state를 http only 쿠키에 실어서 보냄. (유효 시간 : 10분)
클라이언트는 회원가입 정보를 이어서 입력한 후에, 회원가입 API를 호출함. (이메일 인증 state 쿠키도 함께 전송)
서버는 회원가입 API에서 이메일과 인증 state로 인증 상태 확인 후, 유효하면 회원 가입 처리 진행함. (만약 시간이 오래 지나서 인증 state가 사라졌다면, 다시 이메일 인증하라고 예외 던지기)
회원 가입이 성공적으로 마무리되면, Redis에 저장해둔 인증 state를 제거함.