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...ZaAbBcC...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
,