어떤 버그인가요
학교 이메일 인증 완료 후 실제 인증에 사용한 이메일 주소가 영속 저장되지 않아, 동일한 학교 이메일 주소로 다른 계정이 다시 인증할 수 있습니다.
현재 인증 요청 시 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:
SiteUser에 verifiedSchoolEmail 필드 추가 및 verifySchool(homeUniversityId, verifiedSchoolEmail) 형태로 인증 완료 정보를 함께 저장
- Repository: 학교 인증 이메일 중복 여부 조회 메서드 추가
- 예:
existsByVerifiedSchoolEmail(String verifiedSchoolEmail)
- Service:
- 인증 요청 또는 인증 확인 시 이미 사용된 학교 이메일이면 예외 처리
- 이메일 비교 전 lower-case/trim 등 정규화 정책 명확화
- 인증 완료 시 Redis의
schoolEmail을 DB에 함께 저장
- ErrorCode: 중복 학교 이메일 사용 시 내려줄 에러 코드/메시지 추가
- Test:
- 인증 완료 후
homeUniversityId와 schoolEmail이 함께 저장되는지 검증
- 이미 인증 완료된 학교 이메일로 다른 사용자가 인증 요청/확인을 시도하면 실패하는지 검증
- 기존 “이미 학교 인증된 사용자” 케이스가 유지되는지 확인
완료 기준
참고 코드
SchoolEmailService.java
- 인증 요청 시 Redis에
SchoolVerificationInfo(schoolEmail, homeUniversityId, code) 저장
- 인증 확인 시
siteUser.verifySchool(info.getHomeUniversityId()) 호출 후 Redis 키 삭제
SiteUser.java
- 현재 학교 인증 결과로 저장되는 값은
homeUniversityId뿐임
SchoolEmailServiceTest.java
- 현재 인증 완료 테스트도
homeUniversityId 저장만 검증함
어떤 버그인가요
학교 이메일 인증 완료 후 실제 인증에 사용한 이메일 주소가 영속 저장되지 않아, 동일한 학교 이메일 주소로 다른 계정이 다시 인증할 수 있습니다.
현재 인증 요청 시
SchoolVerificationInfo.schoolEmail에는 이메일이 들어가지만 Redis 임시 키(school-email:{siteUserId})에만 5분 TTL로 저장됩니다. 인증 확인 성공 후에는SiteUser.homeUniversityId만 갱신하고 Redis 키를 삭제하기 때문에, 인증 완료 후 동일 이메일 사용 여부를 조회할 영속 데이터가 남지 않습니다.발생 영역
POST /my/school-email,POST /my/school-email/confirmsrc/main/java/com/example/solidconnection/siteuser/controller/MyPageController.javasrc/main/java/com/example/solidconnection/siteuser/service/SchoolEmailService.javasrc/main/java/com/example/solidconnection/siteuser/dto/SchoolVerificationInfo.javasrc/main/java/com/example/solidconnection/siteuser/domain/SiteUser.javasrc/main/resources/db/migrationsrc/test/java/com/example/solidconnection/siteuser/service/SchoolEmailServiceTest.java원인
SchoolEmailService.requestSchoolEmailVerification()는 학교 이메일, 국내 대학 ID, 인증 코드를 Redis에 저장합니다.SchoolEmailService.confirmSchoolEmail()는 코드 검증 성공 시siteUser.verifySchool(info.getHomeUniversityId())만 호출합니다.SiteUser.verifySchool()은homeUniversityId만 저장하며,SiteUser에는 학교 인증 이메일을 저장하는 컬럼이 없습니다.info.schoolEmail값은 사라집니다.SiteUserRepository에는 학교 인증 이메일 기준 중복 검증 메서드가 없고, 현재site_user.email은 로그인/가입 이메일(auth_type과 unique)이라 학교 인증 이메일과 의미가 다릅니다.작업 영향 영역
site_user에 인증 완료된 학교 이메일 저장 컬럼 추가 필요verified_school_email VARCHAR(100) NULLSiteUser에verifiedSchoolEmail필드 추가 및verifySchool(homeUniversityId, verifiedSchoolEmail)형태로 인증 완료 정보를 함께 저장existsByVerifiedSchoolEmail(String verifiedSchoolEmail)schoolEmail을 DB에 함께 저장homeUniversityId와schoolEmail이 함께 저장되는지 검증완료 기준
verified_school_email로 DB에 영속 저장된다.site_user.email)과 학교 인증 이메일은 별도 의미로 유지된다.참고 코드
SchoolEmailService.javaSchoolVerificationInfo(schoolEmail, homeUniversityId, code)저장siteUser.verifySchool(info.getHomeUniversityId())호출 후 Redis 키 삭제SiteUser.javahomeUniversityId뿐임SchoolEmailServiceTest.javahomeUniversityId저장만 검증함