ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정규표현식( Regular Expression ) 및 패스워드( Password ) 정책
    보안(Security)/Login, Password Policy 2018. 9. 10. 09:54

    사이트 회원가입을 할 때 "비밀번호는 영어 대,소문자 / 특수문자 / 숫자를 사용해 8자 이상 입력해주세요" 라는 글을 많이 봤을 것이다. 개발자 입장에서 사용자가 입력한 비밀번호가 상기 조건을 만족하는지 어떻게 확인할까? 여기서 정규 표현식이 필요하다.

     정규 표현식(Regular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 줄여서 regix라고 칭한다. 각종 프로그래밍 언어에서 지원하고 있고, 자바에서는 regix 패키지를 통해 지원한다. 로그인 할 때 빈번하게 사용되는 정규표현식 정리

    메타문자
    설명
    .
    임의 1개 문자와 일치해야 함
    *
    메타 문자 앞의 문자가 0개 이상 일치해야 한다
    [...]
    일치 문자 목록
    [^...]
    비일치 문자 목록
    (...)
    괄호 안의 문자열 하나로 처리
    a-z
    영 소문자
    A-Z
    영 대문자
    0-9
    숫자
    가-힣
    한글
    {8, 15}
    자수 제한 (8 ~ 15자. {8, } 은 최소 자수만 8자로 제한

    @RequestMapping("/member/registry" )
    	public void registryMember(MemberRegistryVO memberVO, HttpServletResponse response) {
    		try {
    			//FIXME 회원가입시 비밀번호 체크하기
    			/*
    			 * 하나 이상의 알파벳을 포함해야 함
    			 * 하나 이상의 숫자를 포함해야 함
    			 * 하나 이상의 특수문자를 포함해야 함
    			 * 최소 8글자 이상 입력해야 함
    			 */
    			
    			boolean isValidPassword = verify(memberVO.getUserPassword());
    			
    			if( isValidPassword ) {
    				memberService.addMember(memberVO);
    				SendMessage.send(response, "OK");
    			} else {
    				SendMessage.send(response, "FAIL");
    			}
    			
    		}
    		catch(RuntimeException re) {
    			re.printStackTrace();
    			SendMessage.send(response, memberVO.getUserId() + "은(는) 이미 등록된 아이디 입니다.");
    		}
    	}
    

    비밀번호 정책 준수 확인 컨트롤러. 정책을 준수한 비밀번호인지 verify 메소드를 통해 확인한다.

    public boolean verify(String password) {
    		
    		String passwordPolicy = "((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9가-힣]).{8,})";
    		
    		Pattern pattern = Pattern.compile(passwordPolicy);
    		Matcher matcher = pattern.matcher(password);
    		return matcher.matches();
    	}
    

    정책 준수여부 확인 메소드. regix 패키지의 Pattern 객체와 Matcher 객체를 다음과 같이 이용하면 
    지정한 정규표현식을 지켰는지 여부를 boolean 형태로 리턴한다. 
    a-z를 포함하는 문자열(영소문자), A-Z를 포함하는 문자열(영대문자), 0-9를 포함하는 문자열(숫자), a-zA-Z0-9가 아닌 문자열(특수문자)가 반드시 포함된 8자 이상의 문자열이 와야 true를 리턴한다는 의미가 된다.


Designed by Tistory.