라떼는말이야

[Android] 비밀번호 정규식으로 제한하기 (password regex) 본문

안드로이드

[Android] 비밀번호 정규식으로 제한하기 (password regex)

MangBaam 2022. 1. 16. 02:47
반응형

프로젝트에서 회원가입 화면을 만들면서 아이디, 비밀번호 등의 입력을 제한해야 하는 작업이 필요했다.

대표적으로 비밀번호인데, 비밀번호 규칙은 회사마다 다르지만 각자의 기준을 가지고 있다.

 

네이버의 비밀번호 규칙

네이버 비밀번호 규칙

 

구글의 비밀번호 규칙

구글 비밀번호 규칙

 

KISA(한국 인터넷 진흥원)의 비밀번호 권고 사항

KISA의 비밀번호 권고 사항

 

사진에 링크 걸어놨으니 클릭하면 더 자세한 내용 확인할 수 있음

 

구상

우선 내가 적용할 비밀번호의 규칙을 정해야 한다.

나는 숫자, 영어 알파벳(대/소문자 상관없이), 특수문자 하나 이상씩을 포함하는 규칙을 세웠다.
특수문자는 ! @ # $ % ^ + - = 로 제한했다.
비밀번호 길이는 8자 이상, 24자 이하로 정했다.

 

> UI 적으로는 사용자가 입력을 시작했을 때 입력할 수 없는 문자는 입력 창에 입력되지 않도록 하면서 사용자에게 알려주고, 실시간으로 입력된 비밀번호의 상태를 표시했다.

> 입력할 수 있는 최대 글자(24자)를 입력한 경우 더 이상 입력되지 않고, 사용자에게 알려준다.

> 비밀번호가 입력된 후 회원가입 버튼을 누를 때 비밀번호가 유효한지 검증한다.

> 비밀번호 검증은 정규 표현식(이하 정규식)을 사용한다.

 

비밀번호가 유효한지 확인하는 정규식은 2개 필요하다

 

  1. 하나는 입력되는 시점에 유효한 문자가 입력됐는지 확인하는 정규식
  2. 다른 하나는 입력이 완료된 시점에 입력된 비밀번호가 유효한지 확인하는 정규식

 

정규식은 매우 강력하기 때문에 아주 다양한 상황의 문자열을 필터링할 수 있다.

그러나 상황에 따른 필터링을 다르게 적용하기 위해 용도에 따라 별도의 정규식을 사용했다.

 

정규식

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

나는 정규식을 사용할 때 위 사이트를 애용한다.

이런 식으로 정규식을 테스트해 볼 수 있고

각각의 의미를 확인할 수 있다.

이 게시글에서는 정규식을 어떻게 짰는가에 대한 내용은 설명하지 않겠다. 위 사이트에 정규식을 입력하면 자세한 설명을 확인할 수 있다.

 

TIP: 코틀린에서는 """ """(따옴표 3개) 안에 정규식을 넣으면 $와 같은 Escape 문자를 무시한다.

 


 

1. 입력되는 시점에 사용되는 정규식

val pwRegex = """^[0-9a-zA-Z!@#$%^+\-=]*$"""

 

입력되는 시점에는 입력 가능한 문자열만을 걸러내야 한다.

허용되는 문자는 숫자, 영어 대소문자, 특수문자(!, @, #, $, %, ^, +, -, =)이다.

 

2. 입력이 완료된 시점에 사용되는 정규식

private val pwRegex = """^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$%^+\-=])(?=\S+$).*$"""

입력이 완료된 시점에는 비밀번호가 유효 한 지 검증한다.

정규식의 내용은 숫자, 영어, 특수문자의 조합(하나 이상 포함), 공백 포함 불가이다.

 

물론 위 정규식에서 입력된 내용의 길이를 체크할 수 있다. 하지만 입력 값이 잘못된 경우와 입력 길이가 잘못된 경우에 각각 다른 에러 메시지를 전달하기 위해 하나의 정규식에 표현하지 않았다.

 

안드로이드(코틀린)에서의 정규식

안드로이드에서 정규식을 사용하는 방법은 다양하지만 대표적으로 Pattern과 Matcher를 사용하는 것이다.

// 패스워드: 알파벳, 숫자, 특정 특수 문자 입력 가능
etPw.filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
    val pwRegex = """^[0-9a-zA-Z!@#$%^+\-=]*$"""
    val pwPattern = Pattern.compile(pwRegex)
    if (source.isNullOrBlank() || pwPattern.matcher(source).matches()) {
        return@InputFilter source
    }
    makeToast("입력할 수 없는 문자입니다: $source")
    ""
})

InputFilter를 사용하면 EditText에 입력되는 값을 필터링할 수 있다. 이때 정규식이 사용된다.

사용하고자 하는 정규식은 pwRegex 변수에 담겨있다.

 

val pattern = Pattern.compile(정규식) // 패턴 생성
val macher = pattern.matcher(검증할 문자) // 매쳐 생성

macher.matches() // 검증할 문자가 일치하는지 true/false로 반환

 

 

 

위와 같은 패턴으로 정규식을 사용해 필터링할 수 있다.

반응형
Comments