Jeen - Yet anothere techlog

STFUAWSC

Regexp::Wildcards

저같은 평범한 개발자야 어떤 패턴을 확인하고 정규표현식을 쓰면 되는데, 사실 일반 사용자들에게 정규표현식을 어떤 설정의 입력값으로 밀어넣는 것은 일반 사용자에게 배려가 부족하지 않나 하고 생각했었습니다.

  • /path/a/b
  • /path/a/c
  • /path/a/d

/path/a/ 디렉토리 아래의 b,c,d 파일들을 삭제한다고 합니다. 물론 b,c,d 밖에 없다고 합니다. 이럴때 보통 모두가 대개 와일드카드를 사용하죠.

bash $ rm -rf /path/a/*

라고 말이죠.

예를들어서 어떤 관리자페이지 아래에서 특정 유저그룹의 접속권한에 대해서 다룬다고 해봅니다. 특정그룹은 고정IP를 통해서 접근해올 수 있고, 또 다른 그룹은 특정 IP대역에서 찾아온다고 합니다. 이런 것들을 복잡한 설정파일을 통해서가 아니라 유저가 관리하기 쉬운 인터페이스를 제공해야 할 필요도 있죠.

일반적인 입력예는 아래와 같습니다.

  • 211.123.123.1-211.123.123.254
  • 211.123.122.5
  • 211.123.121.4, 211.123.121.8

적당한 IP대역이거나, 혹은 단일 IP라거나, 혹은 몇몇 패턴을 알 수 없는 복수개의 IP라거나…

  • 211.123.126.0/24

혹은 네트워크 관리자라면 CIDR 스타일을 사용할지도 모르겠습니다.

  • 211.123.128.\*
  • 211.123.121.10\*

아니면 위에서 말한 대로 와일드카드를 사용할 수 있겠죠.

우선 위의 네개째까지는 Net::IPAddrRanges 라는 모듈을 사용하면 편하게 이용할 수 있습니다.

~~~ perl use strict; use warnings; use Net::IPAddrRanges;

my $ranges = Net::IPAddrRanges->new; $ranges->add(qw{

211.123.123.1-211.123.254
211.123.122.5
211.123.121.4 211.123.121.8
211.123.126.0/24

});

$ranges->find(‘211.123.123.5’); # OK; ~~~

이런저런 다양한 입력값들을 받아서 Net::IPAddrRanges 모듈에 넘겨주고 ->find 메소드를 통해서 접속해온 IP(211.123.123.5)가 접속가능한 IP인지를 위처럼 간단하게 확인할 수 있죠.

와일드카드 사용시에는 이와는 좀 다릅니다.

~~~ perl use strict; use warnings; use Regexp::Wildcards;

my $rw = Regexp::Wildcards->new( type => ‘unix’ );

my $user_ip = ‘211.123.121.108’;

if (scalar grep { $user_ip =~ $_ }

       map { $rw->convert($_) } qw{ 211.123.128.* 211.123.121.10\* }) {
print "OK";

} ~~~

뭐 사실 이런 코드를 적당한 메소드로 만들어서 사용하고 있습니다. IP제한같은 시나리오에는 사실 Net::IPAddrRanges 를 사용하는 게 좋아보이기는 합니다만… 최근에 Regexp::Wildcards 를 사용하는 경우가 있었는데…

유저의 권한별로 페이지의 접근을 제어하고 싶다라는 것이었죠.

yaml ROLE1: [ /admin/user/list, /admin/user/*/download ] ROLE2: [ /admin/user/* ]

ROLE1 의 경우에는 admin/user 라는 컨트롤러중에 유저 리스트(/admin/user/list) 와 각 유저별로 관련정보를 다운로드를 할 수 있습니다. 그 이외에는 전부 접근을 차단한다는 것이구요.

ROLE2 의 경우에는 admin/user 의 모든 액션에 접근을 가능하게 합니다.

이때는 카탈리스트를 사용하고 있다는 전제아래, Admin.pm 이라는 컨드롤러파일의 auto 아래 다음과 같은 코드를 추가했습니다.

~~~ perl sub auto :Private { ….

my $rw = Regexp::Wildcards->new( type => 'unix' );

my $ACL = ...; # 어떻게 샤바샤바해서 유저권한에 따른 접근가능 목록을 뽑아옵니다

unless (scalar grep { $c->action =~ $_ } map { $rw->convert($_); } @{ $ACL }) {
    $c->flash( warn_messages => \[ '접속할 수 없어요.' \] );
    $c->res->redirect($c->uri_for("/admin"));
    return 1;
}

…. } ~~~

네 아무튼 뭐 사실 결론은 굳이 할 수 있다면 간단하게 설정할 수 있는데, 왜 설정파일에까지 정규표현식이 끼어들어야 하느냐 라는 생각아래에서 시작했었지요. 정규표현식으로 난무할 이런저런 상황들을 적당하게 와일드카드로 커버할 수 있다면 더 직관적으로 이해하고 사용할 수 있지 않을까 하는 생각이 듭니다.

Comments