Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 기존 학교 이메일 인증 API 기능(동작 방식) 재구성 #381

Merged
merged 11 commits into from
Jun 17, 2024

Conversation

seulgi99
Copy link
Contributor

@seulgi99 seulgi99 commented Jun 12, 2024

🌱 관련 이슈

🤔 작업 배경 및 사유

기존 학교 이메일로 인증번호를 전송하고 그 값을 redis에 저장 후 ttl전에 인증요청을 할 시 인증되도록 구현되어 있습니다.

이 방식을 사용 할 시 아래와 같은 문제점이 나오게 되었습니다.

  1. 메일로 인증번호 받고 그 번호를 다시 해당 페이지에서 인증하는 경우 depth가 최소 2번이상 발생
  2. 번호 인증 완료 전에 인증페이지를 이탈할 경우 다시 인증메일을 받아야하는 불편함 존재

따라서 해당 문제점을 해결하기 위해 인증 링크를 통해 인증번호 입력 페이지 없이 인증가능하도록 기능 변경을 하게되었습니다.

📌 작업 내용 및 특이사항

  • 메일로 인증번호를 보내는 것이 아닌 인증완료 url을 보내도록 변경(링크 : 프론트 인증 catch page + query string으로 토큰 전달)
  • 해당 페이지 클릭시 프론트에서 백엔드로 해당 토큰으로 인증요청 -> 완료하도록 인증 api 수정
  • 기존 redis에 인증번호, memberId를 저장하던 방식을 아예 제거하고, jwt방식으로 인증하도록 변경하였습니다. (redis를 사용하지않아 redis부하 감소)
  • 검증로직또한 redis에서 ttl로 만료시간을 보는게 아닌 jwt 만료시간을 보도록 변경
  • 해당 생성로직을 전부 jwtUtil에 만드려 했으나 해당 jwtUtil엔 계정토큰(access, refresh용 코드이기에 따로 EmailVerificationTokenUtil에서 생성하도록 하였습니다)
    -이메일 인증하기 api GET -> PATCH로 수정

마지막으로, 조금 우려되는 사항이 해당방식으로 했을 시, jwt로만 검증하다보니 여러 인증메일을 요청한다면, 그중 어떤 링크를 선택하든 인증이 된다는 점이 우려됩니다. 사실 이건 어떤 방식이든 제가 재인증 검증을 넣어둬서 상관없지만 기획이 아래처럼 어떠냐에 따라 변경해야 할 수도 있을것 같습니다.

  1. 가장 최근에 보낸 인증메일의 링크로만 인증가능하도록 해야한다. -> redis에 멤버 id별로 토큰을 저장해둬서 해당 링크에 삽입된 토큰인지 검증하도록 한다
  2. 모든 메일의 인증링크로 인증가능하다. -> 변경사항 없을 것

이렇게되므로 기획적으로 한번 논의해봐야할것 같습니다.

☑️ToDo

  • 프론트에게 이메일인증 링크 catch해서 인증하는 페이지 변경 및 로직 체크해주기
  • 이메일 인증 변경점 프론트 담당자와 로직 동기화하기

📝 참고사항

📚 기타

코드는 기존 작업자 코드 스타일대로 최대한 짯는데 여러분들 입맛에 맞을지는 모르겠네요 ㅠ

@seulgi99 seulgi99 added the ⚓ Domain: Membership 멤버십 관련 작업 label Jun 12, 2024
@seulgi99 seulgi99 self-assigned this Jun 12, 2024
@seulgi99 seulgi99 requested a review from a team as a code owner June 12, 2024 16:55
Copy link

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link
Member

@Sangwook02 Sangwook02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다~

@@ -43,6 +43,7 @@ public enum ErrorCode {
UNIV_NOT_VERIFIED(HttpStatus.CONFLICT, "재학생 인증이 완료되지 않았습니다."),
DISCORD_NOT_VERIFIED(HttpStatus.CONFLICT, "디스코드 인증이 완료되지 않았습니다."),
BEVY_NOT_VERIFIED(HttpStatus.CONFLICT, "GDSC Bevy 가입이 완료되지 않았습니다."),
EMAIL_ALREADY_VERIFIED(HttpStatus.CONFLICT, "이미 이메일 인증된 회원입니다."),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

line 50과 중복되는 것 같습니다~

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 이건 line50과 좀 다른게 line50의 경우엔
이메일 중복검증 이고 이건 인증을 이미 한 회원이 재인증한경우 에러뱉도록 하는거에요!

public ResponseEntity<Void> sendUnivEmailVerificationLink(
@RequestParam(VERIFY_EMAIL_REQUEST_PARAMETER_KEY) String verificationCode) {
univEmailVerificationService.verifyMemberUnivEmail(verificationCode);
@RequestBody @Valid UnivEmailTokenVerificationRequest verificationToken) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dto는 request라는 이름으로 받고 있습니다~

Suggested change
@RequestBody @Valid UnivEmailTokenVerificationRequest verificationToken) {
@RequestBody @Valid UnivEmailTokenVerificationRequest request) {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메일로 보내는 링크는 /onboarding/verify-email?%token={token value}의 형태던데,
그걸 클릭하면 인증되는 방식 아닌가요?
만약 맞다면 파라미터가 아닌 body로 토큰을 받는 이유가 궁금합니다!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메일로 보내는 링크는 /onboarding/verify-email?%token={token value}의 형태던데, 그걸 클릭하면 인증되는 방식 아닌가요? 만약 맞다면 파라미터가 아닌 body로 토큰을 받는 이유가 궁금합니다!

이거 하나만 설명 부탁드립니다!

Copy link

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link
Member

@uwoobeat uwoobeat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Copy link
Member

@AlmondBreez3 AlmondBreez3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

단순한 궁금증인데 이건 테스트코드로 못짜나용?

Copy link
Member

@Sangwook02 Sangwook02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

백엔드 팀 온보딩 가이드를 보시면 커밋 메시지 컨벤션이 정리되어있습니다.
대체로 잘 지켜주셨는데, 콜론 앞에는 공백이 없어야 합니다!
해당 내용 한번 더 확인해보시고 pr 제목만 컨벤션에 맞게 수정 부탁드립니다!

@uwoobeat
Copy link
Member

lgtm

단순한 궁금증인데 이건 테스트코드로 못짜나용?

외부 의존성 경계를 기준으로 모킹해서 테스트할 수 있어요
저희는 util 기준으로 외부 의존성 분리하고 있어서 (memberUtil, jda는 제외) util을 모킹하는 식으로 가능합니다

@seulgi99 seulgi99 changed the title feat : 기존 학교 이메일 인증 API 기능(동작 방식) 재구성 feat: 기존 학교 이메일 인증 API 기능(동작 방식) 재구성 Jun 16, 2024
Copy link
Member

@Sangwook02 Sangwook02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Copy link

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

@seulgi99 seulgi99 merged commit 8ead2cb into develop Jun 17, 2024
1 check passed
@seulgi99 seulgi99 deleted the feature/376-univ-email-verify branch June 17, 2024 06:28
Copy link

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

@ImNM
Copy link
Member

ImNM commented Jun 17, 2024

슬기화이팅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
⚓ Domain: Membership 멤버십 관련 작업
Projects
None yet
Development

Successfully merging this pull request may close these issues.

✨ 기존 학교 이메일 인증 API 기능(동작 방식) 변경
5 participants