프로그래밍/서버

[GPIN]GPIN 적용하기_2

guitarhero 2017. 12. 1. 11:53
728x90

저번에 환경 메타정보를 세팅했다면

이번에는 jsp 세팅을 해야된다. 


기본적으로 마이핀+웹모듈(JSP)\G-PIN 클라이언트 모듈\GPIN_Client_WebApp\G-PIN 하위에 있는 예제 jsp를 사용하면 되는데

우선 중요한것이 사이트등록(진흥원)할때 수신 페이지를 해당 jsp중에서 ServiceResponse.jsp로 해줘야 한다는 것이다. 

이유인 즉슨 로직을 보면 알겠지만 세션에 값들을 넣어주는데 parsing(SAML)을 이페이지에서 해주기 때문이다. 

(사실 한페이지로 합쳐도 상관없지만 예제가 그러하니 따라가는걸로..)


그리고 처음에 gpin 인증 시작할때 호출하는 페이지인 Sample-AuthRequest.jsp에서도 그렇고 ServiceResponse.jsp에서도 그렇고 

사용하는 proxy 인스턴스 생성 로직이 에러가 난다.... (이게 싱글톤으로 변경하려고 로직을 변경한것 같은데 그에 대한 사용법이 가이드에는 정확히 나와있지 않다. 그래서 이걸 해결하기 위해서 예전로직을 활요할 수 밖에 없었다....)


원래 로직은

<%@ page language = "java" contentType = "text/html; charset=UTF-8"%>

<%@ page import="gov.mogaha.gpin.sp.proxy.*" %>

<%
    /**
     * 사용자 본인인증을 요청하는 페이지입니다.
     * 회원가입, 게시판 글쓰기등 본인인증이 필요한 경우에 이 페이지를 호출하시면 됩니다.
     * 인증이 완료되면 session에 사용자정보가 설정됩니다.
     * 설정된 사용자 정보를 참조하는 방법은 Sample-AuthResponse를 참조하시기 바랍니다.
     */
    // 인증완료후 session에 저장된 사용자정보를 참조할 페이지, (이용기관 인증수신페이지와 다릅니다.)
    // TODO 이용기관에서 사용하실 페이지를 지정합니다.
    session.setAttribute("gpinAuthRetPage", "Sample-AuthResponse.jsp");
    // 인증 수신시 요청처와 동일한 위치인지를 확인할 요청자IP를 session에 저장합니다.
    session.setAttribute("gpinUserIP", request.getRemoteAddr());

    GPinProxy proxy = GPinProxy.getInstance(this.getServletConfig().getServletContext());

    String requestHTML = "인증요청 메시지생성 실패";
    try
    {
        if (request.getParameter("Attr") != null)
        {
            requestHTML = proxy.makeAuthRequest(Integer.parseInt(request.getParameter("Attr")));
        }
        else
        {
            requestHTML = proxy.makeAuthRequest();
        }
    }
    catch(Exception e)
    {
        // 에러에 대한 처리는 이용기관에 맞게 처리할 수 있습니다.
        e.printStackTrace();
        out.println(e.getMessage());
    }
    // 인증 요청페이지를 생성하여 자동으로 공공I-PIN으로 forwarding 합니다.
    out.println(requestHTML);
%>


이지만 위와같은 방법으로 사용시 GPinProxy.getInstance 부분에서 오류가 발생한다. 그래서 수정한 로직은


<%@ page language = "java" contentType = "text/html; charset=UTF-8"%>

<%@ page import="gov.mogaha.gpin.sp.proxy.*" %>
<%@ include file="/gpin/Gpin_proxy_properties.jsp"%>
<%
    /**
     * 사용자 본인인증을 요청하는 페이지입니다.
     * 회원가입, 게시판 글쓰기등 본인인증이 필요한 경우에 이 페이지를 호출하시면 됩니다.
     * 인증이 완료되면 session에 사용자정보가 설정됩니다.
     * 설정된 사용자 정보를 참조하는 방법은 Sample-AuthResponse를 참조하시기 바랍니다.
     */
    // 인증완료후 session에 저장된 사용자정보를 참조할 페이지, (이용기관 인증수신페이지와 다릅니다.)
    // TODO 이용기관에서 사용하실 페이지를 지정합니다.
    session.setAttribute("gpinAuthRetPage", "Gpin_AuthResponse.jsp");
    // 인증 수신시 요청처와 동일한 위치인지를 확인할 요청자IP를 session에 저장합니다.
    session.setAttribute("gpinUserIP", request.getRemoteAddr());
	session.setAttribute("icrossLogin", "icrossLogin");				
   // g-pin 으로 로그인 할경우 icross 에서 수정 세션으로 생성
	GPinProxy proxy = new GPinProxy();
	
	proxy.Init(GPIN_CLIENT_HOST + ":" + GPIN_CLIENT_PORT, GPIN_CLIENT_CONTEXT, 30000);

    String requestHTML = "인증요청 메시지생성 실패";
    try
    {
        if (request.getParameter("Attr") != null)
        {
            requestHTML = proxy.makeAuthRequest(Integer.parseInt(request.getParameter("Attr")));
        }
        else
        {
            requestHTML = proxy.makeAuthRequest();
        }
    }
    catch(Exception e)
    {
        // 에러에 대한 처리는 이용기관에 맞게 처리할 수 있습니다.
        e.printStackTrace();
        out.println(e.getMessage());
    }
    // 인증 요청페이지를 생성하여 자동으로 공공I-PIN으로 forwarding 합니다.
    out.println(requestHTML);
%>


위와 같이 수정하였다. new를 이용한 인스턴스 생성은 구버전방법인데 위방법을 쓰지 않으면 오류를 발생하고 해당 사항을 해결해 주지 않으니 위의 소스를 사용하였다(결과적으로 잘된다.)

그리고 proxy.Init에서의 정보는 위에서 include한 파일에 정의 되었는데 해당 설정 host(localhost 혹은 127.0.0.1 혹은 각자설치한 호스트) 그리고 port또한 Gpin 톰캣의 포트 정보 클라이언트 컨택스트 값은 webapps의 콘텍스트 값이다. 마지막에는 GPIN_CLIENT_TIMEOUT 값인데 

기본을 15000(15초)로 하니까 타임아웃이 나서 30000(30초)로 늘려서 하니 중간에 timeout이 나는 현상은 없지만 그래도 읽어 드리는 시간이 너무 오래 걸리긴한다... 물론 빠를 때도 있지만 ...


아무튼 이렇게 페이지 설정을 하고 호출을 하면 해당 페이지가 까꿍~


이렇게 뜨면 성공 안뜨면 다른 오류메시지를 해당 서버로그를 확인하면 되시겠다. 

여기에서 결과적으로다가 인증을 마치면 수신페이지로 값을 던져 주는데 


그페이지가 ServiceResponse.jsp 거기에서 SAML파싱을 해서 session에 설정해 준 

session.setAttribute("gpinAuthRetPage", "Gpin_AuthResponse.jsp"); 페이지로 넘기는데 여기 페이지가 

샘플 페이지에는 Sample-AuthResponse.jsp로 되어있다. 

이페이지에 값들이 잘 찍히면 잘 적용된거라 하겠다. 


여기에서 sso에서 사용하는 값으로 해당 페이지에 넘기면 (이건 sso쪽엔지니어에서 가이드를 받거나 해서 처리하면 될듯)

여기까지하면 gpin에서 받아오는 것은 끝난 것이고 후 처리는 해당 사이트에 맞게 하면 되겠다. 


막상 엄청 복잡했고 엄청 에러가 많이 났는데 뭐가 났는지 기록을 다 해놓지 않아서 다 잊어버렸다...

이거라도 기억하고 있다가 나중에 또 적용할 일이 있으면 참고 해야겠다. 

혹시 다른 에러를 만나신분은 댓글 달아 주시면 제가 아는 선에서는 알려드릴게요~ ㅎㅎ


그럼 이만

728x90