Skip to content

fix: 학교 이메일 인증 완료 시 인증 이메일을 저장해 중복 인증을 차단한다 #807

Description

@Hexeong

어떤 버그인가요

학교 이메일 인증 완료 후 실제 인증에 사용한 이메일 주소가 영속 저장되지 않아, 동일한 학교 이메일 주소로 다른 계정이 다시 인증할 수 있습니다.

현재 인증 요청 시 SchoolVerificationInfo.schoolEmail에는 이메일이 들어가지만 Redis 임시 키(school-email:{siteUserId})에만 5분 TTL로 저장됩니다. 인증 확인 성공 후에는 SiteUser.homeUniversityId만 갱신하고 Redis 키를 삭제하기 때문에, 인증 완료 후 동일 이메일 사용 여부를 조회할 영속 데이터가 남지 않습니다.

발생 영역

  • API: POST /my/school-email, POST /my/school-email/confirm
  • Controller: src/main/java/com/example/solidconnection/siteuser/controller/MyPageController.java
  • Service: src/main/java/com/example/solidconnection/siteuser/service/SchoolEmailService.java
  • Redis 임시 DTO: src/main/java/com/example/solidconnection/siteuser/dto/SchoolVerificationInfo.java
  • 사용자 엔티티/스키마: src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java
  • DB migration: src/main/resources/db/migration
  • 테스트: src/test/java/com/example/solidconnection/siteuser/service/SchoolEmailServiceTest.java

원인

  • SchoolEmailService.requestSchoolEmailVerification()는 학교 이메일, 국내 대학 ID, 인증 코드를 Redis에 저장합니다.
  • SchoolEmailService.confirmSchoolEmail()는 코드 검증 성공 시 siteUser.verifySchool(info.getHomeUniversityId())만 호출합니다.
  • SiteUser.verifySchool()homeUniversityId만 저장하며, SiteUser에는 학교 인증 이메일을 저장하는 컬럼이 없습니다.
  • 인증 성공 직후 Redis 키를 삭제하므로 info.schoolEmail 값은 사라집니다.
  • SiteUserRepository에는 학교 인증 이메일 기준 중복 검증 메서드가 없고, 현재 site_user.email은 로그인/가입 이메일(auth_type과 unique)이라 학교 인증 이메일과 의미가 다릅니다.

작업 영향 영역

  • DB: site_user에 인증 완료된 학교 이메일 저장 컬럼 추가 필요
    • 예: verified_school_email VARCHAR(100) NULL
    • 동일 학교 이메일 중복 인증 방지를 위한 unique 제약 필요
  • Domain: SiteUserverifiedSchoolEmail 필드 추가 및 verifySchool(homeUniversityId, verifiedSchoolEmail) 형태로 인증 완료 정보를 함께 저장
  • Repository: 학교 인증 이메일 중복 여부 조회 메서드 추가
    • 예: existsByVerifiedSchoolEmail(String verifiedSchoolEmail)
  • Service:
    • 인증 요청 또는 인증 확인 시 이미 사용된 학교 이메일이면 예외 처리
    • 이메일 비교 전 lower-case/trim 등 정규화 정책 명확화
    • 인증 완료 시 Redis의 schoolEmail을 DB에 함께 저장
  • ErrorCode: 중복 학교 이메일 사용 시 내려줄 에러 코드/메시지 추가
  • Test:
    • 인증 완료 후 homeUniversityIdschoolEmail이 함께 저장되는지 검증
    • 이미 인증 완료된 학교 이메일로 다른 사용자가 인증 요청/확인을 시도하면 실패하는지 검증
    • 기존 “이미 학교 인증된 사용자” 케이스가 유지되는지 확인

완료 기준

  • 학교 이메일 인증 성공 시 인증에 사용한 이메일 주소가 verified_school_email로 DB에 영속 저장된다.
  • 이미 인증 완료된 학교 이메일 주소로 다른 계정이 중복 인증할 수 없다.
  • 기존 사용자의 로그인 이메일(site_user.email)과 학교 인증 이메일은 별도 의미로 유지된다.
  • Redis는 인증 코드 확인 전 임시 저장소로만 사용되고, 인증 완료 후 중복 검증은 DB 기준으로 동작한다.
  • 관련 마이그레이션과 서비스 테스트가 추가/수정된다.

참고 코드

  • SchoolEmailService.java
    • 인증 요청 시 Redis에 SchoolVerificationInfo(schoolEmail, homeUniversityId, code) 저장
    • 인증 확인 시 siteUser.verifySchool(info.getHomeUniversityId()) 호출 후 Redis 키 삭제
  • SiteUser.java
    • 현재 학교 인증 결과로 저장되는 값은 homeUniversityId뿐임
  • SchoolEmailServiceTest.java
    • 현재 인증 완료 테스트도 homeUniversityId 저장만 검증함

Metadata

Metadata

Assignees

Labels

버그Something isn't working

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions