인프런 커뮤니티 질문&답변

googoo9님의 프로필 이미지
googoo9

작성한 질문수

대기업 서버 개발자가 알려주는 Spring, AWS를 활용한 이메일 전송 시스템

강의소개

안녕하세요 추가구현사항에 대해 질문이있습니다.

해결된 질문

작성

·

84

1

강의 잘 들었습니다!

추가로 질문이 있어서 글 남기겠습니다 ~

강의를 듣는 목적은 프로젝트에서 회원가입 시 이메일 인증 및
id/password 찾기에 대한 인증번호 전송이었습니다.

 

사용자의 이메일로 인증번호(ex 6자리 007007) 를 보내 그 사용자가 사이트에 입력 후 번호가 맞으면 이메일인증 , password 찾기 서비스를 이용할수 있게끔 하고싶습니다.

 

검증유효시간 그런거는 다 제쳐두고 위의 인증 기능만 단순히 구현해보고싶은데요

1. 인증번호 6자리를 어떻게 서버에 보관할수 있을까요?


2. 보관 후 그것이 특정 사용자에게 맞는 인증번호인지 확인할까요??


제가 지금 생각해본 방식입니다.


temp_user 테이블 생성하고 pk(email), column(verify_code) 컬럼을 만든다

사용자가 이메일 인증요청을 하면 temp_user 테이블에
email,verify_code보관 및 verify_code 전송

사용자가 인증번호 확인하려고 입력을 하면 email값에 맞는 verity_code인지 temp_user table에서 꺼내와서 확인

인증번호 검증 후 회원가입 완료 로직 ->
temp_user 삭제 후 입력 정보 user 테이블에 저장하는 방법입니다 .

 

긴 글 읽어주셔서 감사합니다.
생각의 방향이 맞는지 아니면 더 좋은 방법이 있는지 알려주시면 감사하겠습니다 !!

답변 2

1

Hong님의 프로필 이미지
Hong
지식공유자

음 아니요 이러한 시스템에 대해서는 사실 RDB를 사용하실 필요가 없습니다.

 

현재 제가 이해한 구현해야 하는 기능은 다음과 같습니다.

1. 기본적인 비밀번호 찾기
2. 인증번호를 입력해서, 정상적이면 다음 비밀번호 수정 및 찾기 페이지로 이동
3. 인증번호가 원하는 시간안에 들어오지 않으면 실패로 처리

 

지금 해당 상황을 보자면, 일단 인증번호는 원하는 6자리의 숫자를 이메일을 통해서 전송하시면 됩니다.

여기서 문제는 서버측에서 해당 인증번호가 어떤 유저와 매칭이 되어야 하는지에 대해서 고민이 있으신거 같아요.

 

굉장히 간단합니다. TTL도 필요하기 떄문에, Redis를 사용하시면 됩니다.

DB를 해당 서비스에서 다루는 방법도 가능하지만, 그러면 인증번호가 유효한지 확인할 떄 마다 디스크 접근이 필요하고 네트워크 IO가 소요가 됩니다.

 

그러기 보다는 캐싱을 도입해서

authenticate-hong-password-verify-cache-key

뭐 이런식으로 키를 유저마다 고유하게 생성 할 수 있는 구조로 작성하시고

해당 키에 대한 TTL을 원하는 시간을 설정하시면서, Value 로 인증번호를 해당 캐싱에 담으면 됩니다.

 

그러면 메모리를 통해서 관리가 가능하기 떄문에, 더 효과적이고 간단하게 구축이 가능 할 꺼 같아요.

 

혹시 제가 제대로 이해하고 답변을 드린건지 한번만 확인 부탁드리고 추가적인 질문이나 문제가 있다면 댓글 달아주시면 감사하겠습니다 :)

googoo9님의 프로필 이미지
googoo9
질문자


제대로 이해하고 답변을 주신게 맞습니다 !
자세한 답변 감사합니다.

Redis라는걸 아직 배우질 않아서 생각도 못했었는데
RDB까지 안다녀와도 되고 서버부담도 줄어들고 등등 엄청난 장점이 있네요

추가로 질문드려도 괜찮을까요?


1. 취준생 입장에서 배워야 하는 기술이 많다는게
항상 부담스러운거 같아요
제가 redis를 알고있다면 적용하겠지만 현재 지식이 없어서 추가로 배워야 하는 상황입니다.
위의 기술을 구현하는데 redis를 추가로 배우는건 오버스펙일까요?? 아니면 충분히 배워서 적용할 가치가 있을까요??


2. 오버스펙이라면 Redis를 도입안했을 때 제가 말한 방법이 유효한지 궁금합니다!!
(오버스펙이 아니라고 해주시면 일단 Redis 공부 후 알려주신 방법대로 구현해보겠습니다 !)

감사합니다.


Hong님의 프로필 이미지
Hong
지식공유자

캐싱을 도입하는것은 절대적으로 오버스펙이라고 할 수가 없습니다. 해당 캐싱은 모든 서버에 기본적으로 들어가는 부분이라고 생각을 하시면 됩니다.

크게 잡아서 메모리나 데이터를 관리하는 부분은 다음과 같이 구성 됩니다.

 

1. 서버의 변수 메모리에 할당
2. Redis와 같은 캐싱에 할당
3. DB에 할당

 

위에있는 순서대로 효과적이라고 보시면 됩니다. 하지만 1번의 항목 같은 경우에는 서버가 죽고 뜨고 초기화가 된다는 단점이 있기 떄문에 보통은 2번과 같은 부분에 저장을 하게 됩니다.

그러니 오버스펙이라고 생각하지 마시고 학습을 해보시면 좋을 꺼 같아요!!

 

음 Redis를 도입하지 않는다면, 해당 흐름은 크게 문제되는 부분이 없을꺼같네요!!

 

취준생이라고 하시니 고민이 많으시겟네요 ㅠ.ㅠ 편하게 궁금하신 부분 질문주시면 확인하는대로 답변드리도록 하겠습니다!! 감사합니다 :)

googoo9님의 프로필 이미지
googoo9
질문자

감사합니다 ~
레디스도 공부해보겠습니다
채팅 플랫폼 만드는 것도 궁금해 구매해놨습니다 ~

Hong님의 프로필 이미지
Hong
지식공유자

넵 감사합니다 🙂 강의 외적으로도 질문은 환영하니 많은 질문 부탁드립니다. 저도 취준생 경험을 했어가지고 공감이 많이 가는 부분들이 많네요 ㅎㅎ 재미있고 좋은 개발 하시기를 바라겠습니다!

0

안녕하세요, 인프런 AI 인턴입니다. googoo9님.

이메일 인증 및 인증번호를 통한 검증 로직에 관한 질문이군요. 기존의 유사한 질문과 답변을 찾았습니다.

  1. Spring에서 이메일 인증 기능 구현하기
  2. Spring Security를 활용한 이메일 인증 로직 설계

위 링크들에서, 인증번호를 서버에 저장하고 검증하는 방법에 대한 설명을 찾으실 수 있습니다.

간략한 설명:
1. 인증번호를 서버에 보관하는 방법:
- 사용자 이메일을 primary key로 사용하는 임시 테이블(temp_user)을 생성하여 emailverify_code를 저장합니다.
- 인증번호 생성 후 verify_code 컬럼에 저장하고 사용자의 이메일로 발송합니다.

  1. 특정 사용자에 대해 인증번호 확인하는 방법:
    • 사용자가 인증번호를 입력하면, temp_user 테이블에서 해당 이메일에 매칭되는 verify_code를 조회합니다.
    • 입력한 인증번호와 조회된 verify_code를 비교하여 일치하는지 확인합니다.
    • 인증번호가 일치하면 회원가입 절차를 완료하고, 사용하는 사용자 정보를 user 테이블에 저장한 후 임시 테이블(temp_user)에서 사용자 정보를 삭제하면 됩니다.

이와 같은 방식으로 구현하면 보안성도 높일 수 있습니다. 추가적으로 인증번호의 유효시간과 사용횟수 제한 등을 설정하여 보안성을 강화하는 것도 좋은 방법입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

googoo9님의 프로필 이미지
googoo9

작성한 질문수

질문하기