0. 이 글을 작성하는 이유
평화로운 추석기간, 브런치 설정 관련해서 메일 인증을 하던 도중 이 메일 인증이라는 건 어떤 방식으로 구현되는지 궁금해지기 시작했다.
1. 내가 받은 인증 메일URL은 어떻게 생겼나
이렇게 생겼다.(일부 글자를 지워 정상적으로 변환이 안되게 만들었다.)
https://brunch.co.kr/signin/verify?token=JM1DT1ouT%2BTVY%fgujdQy23Sf%2BN0fRtQ%3D%3D
뒤에 token이라는 단어가 보인다. 이 token이라는 단어에서 당장 생각나는 건 JWT가 생각난다.
JWT의 경우 토큰 만료 시간, 토큰 수신자, 고유 식별자 등을 넣을 수 있어 이 경우 사용하기 적합하다고 생각한다.
사용자의 UUID를 만들어 토큰에 넣은 후 해당 토큰을 분석하여 인증이 완료된 것을 처리하면 될 것이다.
2. 그렇다면 인증이 되었는지 안되었는지 판별하는 부분이 필요하다.
우리는 정말 1초도 망설임 없이 인증하는 것이 아니다. 그러기 때문에 해당 인증이 되었는지 안되었는지 저장을 하는 저장소가 필요할 것이다.
이 경우 사용자와 인증에 대해 기간 내 1:1매칭으로 이루어지기 때문에 Redis와 같은 NoSQL을 이용해 UUID : VerifyData 방식으로 구현을 해도 될 것이다.
스케쥴러가 동작하며 일정 기간동안만 데이터를 보관하며 새로 인증 메일을 보내는 경우 덮어씌우면 될 것이다.
3. SMTP
이제 위에서 토큰으로 유효기간을 확인하는 것을 유추할 수 있었다. 이제 만들어진 토큰을 첨부한 메일을 보내야 한다.
메일 전송을 위해 우리는 SMTP(Simple Maile Transfer Protocol)를 사용해야 한다. (SMTP의 동작 과정에 대해서는 다음에 알아보자.)
직접 메일 서버를 구축한 후 사용도 가능하겠지만 gmail이나 naver의 경우 SMTP서버를 운영하고 있다. 우리는 해당 서버를 경유하여 상대방에게 메일을 보낼 수 있게 된다.
4. 마치며
어떤 방식으로 인증이 이루어질지 생각을 정리해 보았다.
물론 더 나이스한 방법이 있을 수 있겠지만 지금 생각은 이러한 구현이 나올 것으로 예상된다.