ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정규식(정규표현식) Regular Expressions
    기초뿌셔 2024. 8. 5. 18:10

    메타문자, 정규식, 정규 표현식에 대해 접해본 경험이 없다고 생각했다.

    https://blog.naver.com/mu-ze/222254113792

     

    정규표현식 (Regular Expression)의 개념과 텍스트 편집, 정규표현식 활용 툴 추천

    #정규표현식 #regex #regularexpression 오늘은 정규표현식에 대한 포스팅. 한 번 배워두면 IT업계 실무...

    blog.naver.com

    다음 블로그를 참고 해보니 json, html, 복잡한 sql 쿼리 등 각종 데이터에서 특정 문자열을 검색하거나 특정 문자열을 찾아 한번에 수정하는 등의 편집 에 유용한 툴 이라고 한다.

     

    오잉?? 크롤링해봤는데 접해봤을 법한데 정규식을 인지하지 못한 것 아닐까?라는 생각이 들었다.


     

    정규표현식

    정규식(정규 표현식, Regular Expression)문자열에서 특정 패턴을 찾거나, 문자열을 치환하거나, 문자열이 특정 형식인지 검사하는 데 사용하는 강력한 도구다.
    정규식을 사용하면 복잡한 문자열 검색조작 작업을 간결하고 효율적으로 수행할 수 있.

     

    이메일 주소를 검증하는 정규식은 다음과 같다고 한다

    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

     

    정규식의 주요 구성 요소에는 문자 클래스(\d, \w 등), 수량자(*, +, {n,m} 등), 메타문자(., ^, $ 등) 등이 있다.

     

    그렇다면 문자 클래스, 수량자, 메타문자가 뭔데??

     

    문자 클래스 (Character Classes)

    문자 클래스는 대괄호 [ ]를 사용하여 정의하며, 특정 문자 집합에 매치되는 문자들을 정의한다.

     

    • [abc] : a, b, 또는 c 중 하나와 매치
    • [a-z] : 소문자 알파벳 전체와 매치
    • [A-Z] : 대문자 알파벳 전체와 매치
    • [0-9] : 숫자 0부터 9까지와 매치
    • [^abc] : a, b, 또는 c를 제외한 모든 문자와 매치 (부정 클래스)

     

    이 내용을 바탕으로 다음 정규식을 본다면

    [a-zA-Z0-9._%+-]

    a-z, A-Z, 0-9,특수문자._%+-와 매치되는 것을 의미한다.

     

    수량자 (Quantifiers)

    수량자는 문자가 몇 번 나타나는지를 정의한다.

    • * : 0회 이상의 반복 (예: a*는 빈 문자열, a, aa, aaa 등과 매치)
    • + : 1회 이상의 반복 (예: a+는 a, aa, aaa 등과 매치하지만 빈 문자열은 매치하지 않음)
    • ? : 0회 또는 1회의 반복 (예: a?는 빈 문자열 또는 a와 매치)
    • {n} : 정확히 n회의 반복 (예: a{3}은 aaa와 매치)
    • {n,} : n회 이상의 반복 (예: a{2,}는 aa, aaa, aaaa 등과 매치)
    • {n,m} : n회 이상, m회 이하의 반복 (예: a{2,4}는 aa, aaa, aaaa와 매치)

    이 내용을 바탕으로 다음 정규식을 본다면

    [a-zA-Z0-9._%+-]+

    [a-zA-Z0-9._%+-]를 1회 이상 반복해야 한다는 의미로 이메일 아이디가 무조건 존재해야 한다는 것을 의미한다.

    [a-zA-Z]{2,}

    [a-zA-Z]에 매칭되는, 즉 알파벳 문자가 최소 2개 존재해야한다는 것을 의미한다.

    예를 들어 (com, .org, .net)과 같이 TLD(top level domain)이 최소 2글자라는 것이다.

     

     

    메타문자 (Metacharacters) 

    메타문자는 특별한 의미를 가진 문자.

    • . : 개행 문자를 제외한 모든 문자와 매치
    • ^ : 문자열의 시작과 매치 (예: ^abc는 abc로 시작하는 문자열과 매치)
    • $ : 문자열의 끝과 매치 (예: abc$는 abc로 끝나는 문자열과 매치)
    • | : OR 연산 (예: a|b는 a 또는 b와 매치)
    • \ : 이스케이프 문자로, 메타문자 자체를 문자로 인식 (예: \.는 점(.) 문자와 매치)
    • () : 그룹화 (예: (abc)+는 abc, abcabc 등과 매치)
    • [] : 문자 집합 정의 - 문자 클래스
    • \d : 숫자와 매치 (정규식에서 \d는 [0-9]와 동일)
    • \D : 숫자가 아닌 문자와 매치 (정규식에서 \D는 [^0-9]와 동일)
    • \w : 알파벳 문자, 숫자, 밑줄과 매치 (정규식에서 \w는 [a-zA-Z0-9_]와 동일)
    • \W : 알파벳 문자, 숫자, 밑줄이 아닌 문자와 매치 (정규식에서 \W는 [^a-zA-Z0-9_]와 동일)
    • \s : 공백 문자 (스페이스, 탭, 개행 등)와 매치
    • \S : 공백이 아닌 문자와 매치

    이 내용을 바탕으로 다음 정규식을 본다면

    ^[a-zA-Z0-9._%+-]

    ^ : 정규식의 시작을 알리는 것

    [a-zA-Z0-9._%+-] : a-z,A-Z,0-9,특수문자._%+- 에 해당하는 문자 집합

    \.

    '.'은 개행 문자를 제외한 모든 문자와 매치한다는 것을 의미하지만 '\' 이스케이프 문자를 통해 기능을 잃고 문자'.'로 역할을 한다.

    [a-zA-Z]{2,}$

    여기서 $ 문자는 문자열의 끝을 나타내어 정규식 패턴이 문자열의 끝에서 매치되도록 강제한다.

     

     

     


    다음 정규식을 요약해본다면 

    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    • 문자열의 시작부터 끝까지 일치해야 하며 (^와 $).
    • 사용자 이름 부분은 알파벳 대문자와 소문자, 숫자, 점, 밑줄, 퍼센트 기호, 더하기 기호, 하이픈이 포함될 수 있고 ([a-zA-Z0-9._%+-]+).
    • @ 기호를 포함하고,
    • 도메인 부분은 알파벳 대문자와 소문자, 숫자, 점, 하이픈이 포함될 수 있으며 ([a-zA-Z0-9.-]+).
    • 도메인과 최상위 도메인(TLD) 부분은 점으로 구분되며, TLD는 알파벳 문자로 최소 2글자 이상이어야 한다(\.[a-zA-Z]{2,}).

    다음과 같이 정리할 수 있다.


     

    그렇다면 웹 보안에서는 어떻게 사용될까??

     

    입력 검증 및 필터링

     

    • 폼 입력 검증: 사용자 입력이 올바른 형식인지 확인하는 데 정규식을 사용.
    • 파일 업로드 검증: 업로드된 파일의 이름, 확장자, 크기 등을 검증하여 안전하지 않은 파일이 업로드되지 않도록 확인.

     

    악성 코드 탐지

     

    • SQL 인젝션 방지: SQL 인젝션 공격을 탐지하고 차단하기 위해 정규식을 사용하여 악성 쿼리 패턴을 검색.
    • XSS (교차 사이트 스크립팅) 탐지: 스크립트 태그나 자바스크립트 이벤트 핸들러와 같은 XSS 공격 패턴을 탐지.

     

    로그 분석 및 모니터링

     

    • 로그 필터링: 로그 파일에서 특정 패턴을 검색하여 보안 이벤트를 모니터링.
    • 이상 트래픽 감지: 비정상적인 트래픽 패턴을 탐지하여 DDoS 공격이나 봇 트래픽을 분석

     

    정규표현식을 사용한 경험?? 정말 없어?

     

    정리하고 나니, 정규표현식임을 인지하지 못하고 사용한 경험이 있다.

    바로 데이터를 필터링하고 분석한경험이 있는데, 이 때 사용한 경험이 있었다.

     

    Python에서는 re 모듈을 사용하여 정규 표현식을 처리하는데, 스택 데이터를 필터링하기 위해 re.sub()를 테스트 해본 경험이 있었던 것.

     

    하지만 개발 과정에서 굳이 필요없는 부분은 크롤링하지 않는 것을 채택하면서 순간의 경험으로만 멈췄다.

     

    확실히 프로젝트를 진행하면 다양한 언어, 표현 등 을 접하게 되는 것 같다.

    하지만 해당 내용에 대해 베이스가 되는 원리부터 찾아보지 않는다면 '정규표현식을 접해본적 없다'와 같이 의미 없고 애매하게 남는다. 

     

    이 경험을 바탕으로 앞으로 라이브러리나 모듈을 채택할 때 상세한 조사를 진행해야 겠다.

     

    '기초뿌셔' 카테고리의 다른 글

    그래서 해시(Hash)가 뭔데?  (0) 2024.08.01
    C++ 이름 규칙(Naming Rule) 정리  (2) 2024.01.12

    댓글

Designed by Tistory.