Simple Authentication Servlet Filter with JSP/Servlet

자바에서 Servlet filters는 authetication, compression, auding, logging, image conversion, 웹 컨텐츠의 국제화등을 중앙에서 관리할 수 있도록 구현해 주는 인터페이스이다. 여기서 보여주는 서블릿 필터의 예제는 어떻게 간단하게 Java 기반의 웹 애플리케이션에서 인증을 수행하는가에 대해서 보여준다. 이것은 고객이 로그인을 수행했는지 여부와, 페이지가 익스파이어 되었는지, 그리고 각 페이지에 대한 퍼미션 정보를 이 컨텐츠를 통해서 다른 웹 페이지에서 수행하지 않도록 해 준다.

디자인 시나리오는 간단하다. HTTP request가 들어왔을때 로그인 하지 않은 사용자는 login page로 보내진다. 반면 인증된 사용자는 요청된 페이지로 이동을 수행하도록 한다. 사용자가 로그인할 때, 서블릿은 /auth를 호출하고, 인증을 관리한다. 그리고 로그인 실패시 다시 로그인 페이지로 이동하게 만든다. 또한 성공한 경우에는 요청한 페이지로 진행할 수 있도록 해 준다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    System.out.print("Authentication: Request received ...");
    try {
        boolean authorized = false;
        if (request instanceof HttpServletRequest) {
            HttpSession session = ((HttpServletRequest)request).getSession(false);
            if (session != null) {
                UserToken token = (UserToken) session.getAttribute("userToken");
                String qryStr = ((HttpServletRequest)request).getQueryString();
                if((token != null) || "cLogin".equalsIgnoreCase(qryStr))
                    authorized = true;
           }
       }

       if (authorized) {
           chain.doFilter(request, response);
       } else if (filterConfig != null) {
           ServletContext context = filterConfig.getServletContext();
           String login_page = context.getInitParameter("login_page");
           System.out.print("Authentication: Login page = " + login_page);
           if (login_page != null && !"".equals(login_page)) {
               context.getRequestDispatcher(login_page).forward(request, response);
           }
      } else { 
          throw new ServletException ("Unauthorized access, unable to forward to login page");
      }
    } catch (IOException io) {
        System.out.println("IOException raised in AuthenticationFilter");
    } catch (ServletException se) {
        System.out.println("ServletException raised in AuthenticationFilter");
    }
    System.out.print("Authentication: Response dispatched ...");
}

  • user token은 세션에 들어가있고, 이것은 서블릿에서 인증이 성공된 이후에 값이 세팅되게 된다. 이것은 사용자가 로그아웃 하거나 세션이 expire된 경우에는 자동으로 제거된다.
  • 로그인 페이지는 인증용 쿼리의 인증을 위해서 인증 페이지를 호출한다. 이 예제에서는 login.jsp의 폼은 아마도 "http://domain/servlet/auth?cLogin"이 될 것이다. 아래를 보면 알 수 있다.
  • 우리는 첫번째로 토큰을 검사하고, 이것이 적법한경우 우리는 쿼리 스트링을 확인하지 않는다. 이것은 반복적인 콜을 하지 않도록 해주는 중요한 기능이다. 
  • 인증이 성공하면 세션에서 사용자의 토큰이 존재하는지 검사하게 된다. 그러나 사용자가 로그인하는 경우에는 리퀘스트를 처리하도록 놓아둔다.
  • 만약 인증이 실패하고, 올바른 설정값이 존재한다면 우리는 단순하게 로그인 페이지로 요청을 보내게 된다. 그렇지 않은경우 예외를 던진다. (아마도 절대로 이 상황은 오지 않을것이지만... ^^). 애플리케이션을 위한 기본적인 에러 페이지가 화면에 보일 것이다.
Web.xml
Add to the root <app> node.
<context-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</context-param>

<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.package.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Code snippet for Login Page
<%
String urlParams = url + "/auth?cLogin";
%>
<form action="<%=urlParams%>" method="POST">
// Form components
</form>

Code snippet for Servlet:
- 보는것과 같이 doPost()메소드가 호출되면 이미 요청으로 부터 파라미터를 추출하게 된다. 파라미터가 cLogin이될 것이다.
private void performLogin(HttpServletRequest request, HttpServletResponse response,     String username,
String password, ServletContext context) throws ServletException, IOException {
    if((username!=null) & (password!=null)) {
        User user = userFacade.findByUsername(username);
        if(user!=null) {
            UserToken tok = Authentication.authenticateUser(user, username, password);
            if (tok != null) {
                request.getSession().setAttribute("userToken", tok);
                response.sendRedirect(context.getContextPath());
            }
        } else {
            String url = context.getInitParameter("login_page");
            if (url != null && !"".equals(url)) {
                response.sendRedirect(url);
            }
        }
    } else {
        String url = context.getInitParameter(
"login_page");
        if (url != null && !"".equals(url)) {
            response.sendRedirect(url);
        }
    }
}

이게 다다. 웹 애플리케이션에 이 필터를 디플로이 하면 모든 요청에 대해서 인터셉터를 수행하고, 인증 검사를 수행하게 된다.


출처 - http://neokido.tistory.com/entry/%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%95%84%ED%84%B0-%EC%98%88%EC%A0%9C-Redirect-%EC%B2%98%EB%A6%AC




'Development > JSP & Servlet' 카테고리의 다른 글

JSP - 세션 관리  (0) 2012.07.07
JSP - session default timeout 설정  (0) 2012.05.30
jsp/servlet scope  (0) 2012.05.14
JSP 소스 사이트  (0) 2012.05.07
JSTL (JSP Standard Tag Library)  (0) 2012.03.28
Posted by linuxism
,


'Framework & Platform > Spring' 카테고리의 다른 글

Spring - security 예제  (0) 2012.05.23
Spring Security 이해  (1) 2012.05.23
도메인 객체(오브젝트)  (0) 2012.05.21
spring - @SessionAttributes 와 SessionStatus  (0) 2012.05.21
Spring - Validation  (0) 2012.05.21
Posted by linuxism
,


노랑색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다.
(?:\.) {2,}(?=[A-Z])

정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.

컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 이 중 표준화된 것으로는 POSIX의 확장 정규 표현식이 있으며, 표준화되지는 않았지만 펄의 정규 표현식과 그 대체 구현인 PCRE도 널리 사용된다.

문자열을 토큰으로 변환하는 과정에서 텍스트를 좌에서 우로 검사하면서 여러 규칙과 일치될 문자의 수량을 다양하게 시도하는 처리에 가작 적합할 뿐 파싱에는 적절치 않다.[1]

문법[편집]

문자 클래스, "["와 "]" 사이에 포함된 문자 집합 외부에서는 12개의 문자가, 내부에서는 오직 4개의 문자("\", "^", "-", "]", 자바와 닷넷은 "["를 포함)만 특수문자를 의미한다. [2]

식기능설명
.문자1개의 문자와 일치한다. 단일행 모드에서는 새줄 문자를 제외한다.
\이스케이프특수 문자를 식에 문자 자체로 포함한다.
¦선택여러 식 중에서 하나를 선택한다. 예를 들어, "abc¦adc"는 abc와 adc 문자열을 모두 포함한다.
^부정문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.
[]문자 클래스"["과 "]" 사이의 문자 중 하나를 선택한다. "¦"를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 의미한다.
()하위식여러 식을 하나로 묶을 수 있다. "abc¦adc"와 "a(b¦d)c"는 같은 의미를 가진다.
*0회 이상0개 이상의 문자를 포함한다. "a*b"는 "b", "ab", "aab", "aaab"를 포함한다.
+1회 이상"a+b"는 "ab", "aab", "aaab"를 포함하지만 "b"는 포함하지 않는다.
 ?0 또는 1회"a?b"는 "b", "ab"를 포함한다.
{m}m회"a{3}b"는 "aaab"만 포함한다.
{m,}m회 이상"a{2,}b"는 "aab", "aaab", "aaaab"를 포함한다. "ab"는 포함되지 않는다.
{m, n}m회 이상 n회 이하"a{1,3}b"는 "ab", "aab", "aaab"를 포함하지만, "b"나 "aaaab"는 포함하지 않는다.


이에 따라 "(fa|mo|b?o)ther"는 "father", "mother", "bother", "other"를 나타낸다.

많은 프로그래밍 언어에서는 이를 확장한 문법을 가지고 있다. 이 중 일반적으로 사용되는 연산자는 다음과 같다.

  • "^", "$" : 각각 문자열이나 행의 처음과 끝을 나타낸다.

문자 클래스[편집]

문자 클래스는 문자열 일치 다음으로 가장 기본적인 정규 표현식 개념이다. 이는 하나의 작은 일련의 문자열들을 더 큰 집합의 문자열들과 일치시키도록 한다. 이를테면, [A-Z]는 알파벳을 대표하며 \d는 임의의 숫자를 의미할 수 있다. 문자 클래스는 POSIX 수준에 적용한다.

[a-Z]와 같은 특정 범위의 문자들을 지정할 때 컴퓨터의 로캘 설정들은 문자 인코딩의 수치적 나열에 따라 내용을 결정한다. 그러한 나열에 따라 수치들을 저장할 수 있으며 그 순서는 abc...zABC...Z, aAbBcC...zZ와 같이 될 수 있다. 그러므로 POSIX 표준은 문자 클래스를 정의하며 이는 설치된 정규 표현식 처리기가 인지한다. 이러한 정의들은 다음의 표를 따른다:

POSIX비표준펄/TclVimASCII설명
[:alnum:][A-Za-z0-9]영숫자
[:word:]\w\w[A-Za-z0-9_]영숫자 + "_"
\W\W[^A-Za-z0-9_]낱말이 아닌 문자
[:alpha:]\a[A-Za-z]알파벳 문자
[:blank:]\s[ \t]공백과 탭
\b\< \>(?<=\W)(?=\w)|(?<=\w)(?=\W)낱말 경계
[:cntrl:][\x00-\x1F\x7F]제어 문자
[:digit:]\d\d[0-9]숫자
\D\D[^0-9]숫자가 아닌 문자
[:graph:][\x21-\x7E]보이는 문자
[:lower:]\l[a-z]소문자
[:print:]\p[\x20-\x7E]보이는 문자 및 공백 문자
[:punct:][][!"#$%&'()*+,./:;<=>?@\^_`{|}~-]구두점
[:space:]\s\_s (단순히 줄 끝에 추가)[ \t\r\n\v\f]공백 문자
\S[^ \t\r\n\v\f]공백이 아닌 모든 문자
[:upper:]\u[A-Z]대문자
[:xdigit:]\x[A-Fa-f0-9]16진수

주석[편집]

  1. 이동↑ 잰 고이바에르츠, 스티븐 리바이선 저 김지원 역, 《한 권으로 끝내는 정규표현식》, 한빛미디어(주), 2010, 216쪽
  2. 이동↑ 같은 책, 53쪽

바깥 고리[편집]



출처 - http://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D




정규표현식

정해진 패턴을 사용해서 패턴에 일치하는 데이터 검색을 지원하는 표현식

 

 

정규표현식에 쓰이는 특수문자

 

1. '.'
임의의 한 문자

ex)
s.e -> sae, sbe, sce, sde, ...
.ce -> ace, kce, dce, ...

 

2. '*'
바로 앞의 문자가 없거나 하나 이상

ex)
s*e -> e, se, see, ssse, ...
abc* -> ab, abc, abcc, abccc, ...
h*im -> im, him, hhim, hhhim, ...

 

3. '+'
바로 앞의 문자가 하나 이상

ex)
s+e -> se, sse, ssse, ...

 

4. '?'
바로 앞의 문자가 없거나 하나

ex)
th?e -> e, the 이 두가지표현이 유일하겠지.

 

5. '^'
바로 뒤의 문자열로 시작.

ex)
^The  -> The girl is, Theather, ... (뒷부분부터 공백까지 검사)
^a?bc -> bc, abc, ...
^.e -> he, me, request, settle, ...
^s.e? -> sa, sae, sb, sbe, ... (e는 나와도 되고 안나와도 되고)

 

6. '$'
바로 앞의 문자열로 종료

ex)
a?bc$ -> eeabe, seebc, bc, ...
+.e$ -> onthetoe, bctae, appetittle, ...
s?c+$ -> e, se, ee, eee, seee, seee, ...

 

7. '[]'
[] 안에 있는 문자 중 하나, 범위는 '-'로 지정

ex)
[ab]cd -> acd, bcd, ...
[a-z] -> 영문 소문자 (a부터 z까지)
[a-zA-Z] -> 영문자(대소문자)
[0-9] -> 0부터 9까지의 숫자
ag[a-z] -> aga, agbcd, agzzz, ...

 

^ab[cd]ef -> abcef, abdef, ...
^[a-zA-Z] -> 영문자로 시작
^[a-zA-Z_] -> 아이디 검사할 때 첫글자가 영문자와 '_' 만 쓰도록 할때
^[가-힣]  ->  한글로 시작해야 할 때
[^a-zA-Z0-9]  ->  ^이 안으로 들어가면 제외(부정)의 의미가 된다. 영문자나 숫자로 시작할 수 없을 때
[a-zA-Z0-9]$ -> 영문자나 숫자로 종료

 

[가-힣]  ->  한글(완성형)만 가능. ㅋㅋㅋ 같은 문자는 제외
[abc]  -> 이 안에 있는 문자중에 하나. 즉, a b c 중에 하나의 문자.

 

8. '{}'
{} 앞의 문자나 문자열 출현 횟수

ex)
a{2}b -> aab, ... a가 꼭 2번 나와야 한다는 뜻.
a{2,}b -> aab, aaab, aaaab, ...  a가 최소 2번 이상 나오도록 하라는 뜻.
a{2, 3}b -> aab, aaab, ... a는 최소 2번 최대 3번 나오도록 하라는 뜻.

 

9. '()'
()안에 있는 문자를 그룹화

ex)
a(bc){2} -> abcbc, ... a다음 bc가 2번 나와야 한다는 뜻..
a(bc)* -> abcbcbc, ...  a다음 bc의 출현횟수는 무한대가 가능하다는 뜻.

 

10. '|'
or 연산자

ex)
he|she -> he, she is, ...
(he|she)is -> heis, sheis, ...

 

11. 특수 문자 사용
^  []  $  ()  |  *  +  ?  {}  \
앞에 \ 붙여서 사용해야함

ex)
\*+ : * 가 하나 이상 포함된 패턴
\d : 순수한 숫자, 정수값, 0-9
\d{2,3}-/d{3,4}-/d{4}  :   전화번호 정규식. -? 하이퍼뒤에 물음표가 있으면 하이퍼가 있어도 되고 없어도 된다는 뜻.
\D : \d와 반대 (숫자를 제외한 나머지)
\w : [a-zA-Z0-9] 의 줄임표현.
\W : [^a-zA-Z0-9] 영문자와 숫자만 아니면 된다는 뜻.
\s : 공백 문자
\S : \s와 반대 (공백 문자를 제외한 나머지)

  


출처 - http://www.devholic.net/1000238






시간 포맷 00:00 ~ 23:59 에 대한 정규 표현식

^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$


월.일

^([1-9]|1[0-2])[.]([1-9]|[1-2][0-9]|3[01])$


시:분

^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$


모든 공백

\s/g


숫자만

^[0-9]+$


이메일

^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$


핸드폰번호

^\d{3}-\d{3,4}-\d{4}$

^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$


일반 전화번호

^\d{2,3}-\d{3,4}-\d{4}$


아이디나 비밀번호

^[a-z0-9_]{4,20}$


hostname

^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$


'Development > Common' 카테고리의 다른 글

특수문자 이름  (0) 2012.07.17
동기 비동기  (0) 2012.07.03
변수와 메서드 명명 규칙  (0) 2012.04.27
Alpha, Beta 버전  (0) 2012.04.27
문자 바이트 수 계산기  (0) 2012.04.12
Posted by linuxism
,