그러나 이메일 주소가 실제 존재하지 않으면, 향후 사용자에게 이메일을 발송하더라도 실제 사용자에게 이메일이 전달될 수 없는 문제가 있다.
따라서, 해당 이메일이 실제 존재하는 지 입증할 방법이 필요하다.
이메일 인증 기능 흐름
사전 요청
사용자가 우리 서비스에 이메일 주소를 전달한다.
우리 서비스는 '이메일 인증'을 생성하여 데이터베이스에 저장한다.
사용자의 인증 요청이 들어올 때마다 내부적으로 '이메일 인증 객체'를 저장하여 관리한다. 이 안에는 내부적으로 임의의 code 가 생성되어 저장된다.
'이메일 인증'은 무한하게 유지되는 것이 아닌, 일정 시간동안 유지되어야 하는 데이터이다. 그래서 ttl(time to live) 기능을 지원하는 Redis(레디스)를 사용하여 저장하면 관리하기 편하다. 따라서, 이메일 인증 데이터는 Redis(레디스)에 5분동안 저장하고, 5분이 경과하면 자동으로 삭제되게 한다.
사용자에게 실제 이메일을 발송한다. (이메일 본문에는 code 값을 포함하여 발송한다.)
본 요청
사용자는 발송된 이메일을 확인하고, code를 포함하여 우리 서비스에게 전달한다.
우리 서비스는 저장된 '이메일 인증'을 조회하고 사용자가 보낸 code 가 일치하는 지 확인한다.
일치한다면, 이메일 인증됨 처리를 하고, 이메일 인증을 다시 저장한다. (30분간 유효, 30분 뒤 만료되어 삭제됨)
회원 가입
사용자는 가입시 이메일 주소를 전달한다.
이메일 주소에 대응하는 이메일 인증이 저장되어 있고 현재 유효한지 확인한다.
이메일 인증이 유효하다면 회원가입 시키고 이메일 인증을 만료시킨다. (물리적 삭제)
사용 기술
데이터베이스 : Redis
데이터베이스 접근기술 : spring-boot-starter-data-redis
이메일 발송 : spring-boot-starter-mail
활용
회원 가입 시 사용자가 전달한 이메일 주소를 가지고, 이메일 인증 저장소를 조회하여 잘 처리된 이메일 인증이 있는 지 확인한다.
인증이 유효하다면, 이를 회원가입을 위해 사용한다.
인증이 저장되어 있지 않다면, 이메일이 유효하다고 보장할 수 없으므로 회원가입을 처리하지 않는다.