Spring에서 이메일을 검증하는 방법

Minjae An·2024년 2월 28일
0

Spring Web

목록 보기
8/9

@Email 어노테이션

@Emailjakarta.validation.constraints 패키지에 속한 어노테이션으로 요청 데이터가 이메일 형식을 준수하는 지 검증하는 데 활용될 수 있다.

@Email 어노테이션의 허점

하지만 @Email 어노테이션을 기본 속성으로 사용하게 되면 우리가 보편적으로 생각하는 mj3242@naver.com 와 같은 이메일 데이터 형식을 올바르게 검증할 수 없다.

@Documented
@Constraint(validatedBy = { })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(List.class)
public @interface Email {
// ...
	String regexp() default ".*";
// ...
}

@Email 어노테이션 코드를 보면 데이터를 검증하는 정규식의 기본값이 .* 로 문자열 내에 아무 문자나 하나 이상 존재하면 유효하다고 판단한다. 따라서 해당 어노테이션을 활용할 때는 무조건 regexp 의 설정을 커스텀해주어야 의도한 대로 이메일 데이터를 검사할 수 있다.

기본 이메일 검증 정규식

이메일에서 로컬, 도메인 부분을 동시에 검증할 수 있는 기본적인 정규식 형태는 다음과 같다.

^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$

로컬 부분 제약

  • 0~9까지의 숫자 값을 허용한다.
  • 영어 대소문자가 모두 허용된다.
  • 밑줄(_ ), 하이픈(- ), 점(.)은 허용된다.
  • 로컬 부분의 시작과 끝에는 점을 사용할 수 없다.
  • 연속된 점은 허용되지 않는다.
  • 로컬 부분의 경우 최대 64자까지 허용된다.

도메인 부분 제약

  • 0~9까지의 숫자 값을 허용한다.
  • 영어 대소문자가 모두 허용된다.
  • 하이픈과 점은 도메인의 시작과 끝 부분에서 허용되지 않는다.
  • 연속된 점은 허용되지 않는다.

유효한 데이터 예시

  • username@domain.com
  • user.name@domain.com
  • username@domain.co.in

RFC 5322 를 바탕으로 한 정규식

[a-zA-Z0-9_!#$%&’*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$

임의의 정규식을 사용하는 대신에 이메일 검증 정규식에 관해 나와있는 RFC 822의 업데이트 버전인 RFC 5322 표준의 정규식을 사용하는 것도 좋은 방법이다. 기본적으로 모든 문자를 허용하는 것을 확인할 수 있다. 다만, |' 를 허용하지 않는데, 이는 잠재적 SQL Injection 발생을 방지하기 위함이다.

Top-level 도메인 체크를 포함한 정규식

^[\\w!#$%&’*+/=?`{|}~^-]+(?:\\.[\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$

최상위 도메인을 체크하는 정규식도 살펴보자. 위 정규식은 기본적으로 이메일 주소에 점이 하나만 존재하는지 검사한다. 또한 최상위 도메인이 2~6자의 길이를 가지는 지 확인한다.

OWASP 정규식

OWASP(open web application security project)에서는 공개적으로 사용 가능한 정규식 패턴 라이브러리인 OWASP Regex Repository를 제공한다.

^[a-zA-Z0-9_+&*-] + (?:\\.[a-zA-Z0-9_+&*-] + )*@(?:[a-zA-Z0-9-]+\\.) + [a-zA-Z]{2, 7}

위 정규식은 대부분의 통용되는 이메일 구조를 검증할 수 있다.

Apache Commons Validator for Email

Apache Commons Validator는 보편적인 검증에 필요한 대부분의 기능을 제공하는 라이브러리이다. 이 라이브러리에서 지원하는 EmailValidator 클래스를 활용하면 RFC 822 표준에 따라 이메일을 검증할 수 있다. 유니 코드 문자들에 대해서도 검증을 제공한다.

의존성 추가

implementation 'commons-validator:commons-validator:1.7'

예시 코드

@Test
public void testUsingEmailValidator() {
    emailAddress = "username@domain.com";
    assertTrue(EmailValidator.getInstance()
      .isValid(emailAddress));
}

참고

profile
내가 쓴 코드가 남의 고통이 되지 않도록 하자

0개의 댓글