본문 바로가기

Java

웹 스크래핑을 위한 국세청 공인인증서 로그인

반응형

국세청 홈텍스 시스템에서 전자세금계산서 데이터 조회와 같은 업무를 수행하려면 반드시 공인인증서로 로그인을 수행해야만 사용할 수 있다.
이런 업무용 페이지의 데이터를 웹 스크래핑 하기 위해서는 공인인증서 로그인 절차를 분석해서 동일한 절차로 데이터를 만들어서 국세청으로 전송하여 인증서 로그인 절차를 자동으로 수행한 이후 원하는 페이지의 데이터를 웹 스크래핑 하면 된다.

이런 절차를 분석하기 위해서는 크롬을 실행하여 F12 키를 눌러서 개발자 모드를 띄우고 그 중 Network 탭을 눌러 놓고 크롬에서 국세청 홈텍스 시스템에 접속하여 공인인증서로 로그인을 수행하면 클라이언트에서 서버로 요청하고 응답을 받은 모든 내용이 기록이 되어 있어 원하는 결과를 찾아보면서 분석하면 된다.
만약 페이지 이동이 되면서 기록이 삭제되면 Network 탭 메뉴 중 Preserve Log 항목을 체크하면 페이지 이동이 되어도 기록된 정보가 삭제되지 않는다.

엄청나게 많은 정보가 기록이 되어 있는데 이미지나 JS 등의 내용을 제외하면 xx.doxx.wseq 등의 이름으로 된 내용이 우리가 눈 여겨 봐야할 항목이다.

본격적으로 공인인증 로그인을 설명하기에 앞서 인증서 로그인에 사용되는 기술에 대해서 설명한다.

공인인증서는 개인용/법인용이 있으며 범용과 용도제한용으로 분류가 된다.
개인은 개인에게 발급되는 인증서이며 법인용은 사업자등록증이 있는 개인 또는 법인 모두를 대상으로 한다.
범용은 인터넷뱅킹, 쇼핑, 전자입찰/전자계약 등의 수많은 업무에 제약없이 사용이 가능한 인증서이며, 용도제한용은 인터넷뱅킹용, 전자세금계산서용 등으로 사용할 용도가 고정된 인증서이다.

공인인증서는 일반적으로 2개의 파일이 한쌍으로 존재하며, 법인용 인증서인 경우에는 서명용과 암호화용으로 구성된 4개의 파일이 2쌍으로 존재한다. 만약 법인용 인증서인데 2개만 있는 경우라면 은행에서 발급받았거나 암호화용은 별도 발급 신청을 해야 발급해주는 기관인 경우이다.

국세청 홈텍스 공인인증서 로그인에는 아래와 같이 서명용 인증서 2개의 파일만 사용된다.

인증서 파일명 파일 종류 비고
signCert.der 서명용 공개키 전자서명 검증용
signPri.key 서명용 개인키 전자서명 수행용

참고로 공개키와 개인키로 나눠있는 것을 RSA(비대칭키) 방식이라고 한다.

보통 서명할 문자열을 서명용 개인키를 사용하여 전자서명하고, 서명된 내용을 공개키를 사용하여 전자서명 검증을 수행하여 검증 성공하면 되는데 국세청 홈텍스로 로그인하기 위해서는 조금 더 복잡한 과정이 필요하다.

인증서 로그인을 수행하기 위해서는 사전에 국세청 홈텍스 시스템에 공인인증서 로그인에 사용될 인증서가 등록되어야 한다.
아마 이 과정에서 국세청 홈텍스는 인증을 위해 PEM 타입(byte[]가 아닌 문자열)의 서명용 공개키와 개인키의 Random 값을 DB화 시켜 놓았을 것으로 추측되는데 이 값들은 공인인증서 로그인을 수행하기 위해서 우리가 공인인증서에서 추출하여 서버로 전송해야 할 값들 중 하나이다.

공인인증서 로그인을 위해서는 먼저 서명할 문자열과 Response Cookies에 저장된 WMONID와 TXPPsessionID 값을 얻어야 한다.

아래의 주소를 브라우저로 요청하면 응답 본문에 서명할 문자열과 세션Response Cookies에서 우리가 원하는 값을 얻을 수 있다.
https://www.hometax.go.kr/wqAction.do?actionId=ATXPPZXA001R01&screenId=UTXPPABA01

응답 본문 예

<map id="">
  <map id="resultMsg">
    <detailMsg/>
    <msg/>
    <code/>
    <result>S</result>
  </map>
  <pkcEncSsn>vxdxxHIfdDXR0ZdgI394oPHKmOU=</pkcEncSsn>
</map>


우리가 필요한 값 항목

항목 분류 항목명
Response Cookies WMONID
Response Cookies TXPPsessionID
응답 본문 XML //map/pkcEncSsn

Response Cookies는 공인인증서 로그인 시 Request Cookies에 같은 값을 넣어서 보내야 같은 세션의 요청으로 간주하여 정상 처리되므로 반드시 필요하고, 응답 본문은 XML로 받게 되는데 XPath를 따라서 파싱하면 서명할 문자열을 얻을 수 있다.

서명할 문자열을 얻었으면 이 값을 국세청 홈텍스에 등록했던 공인인증서를 사용하여 전자서명 한다. 이때 서명 알고리즘은 SHA256withRSA 방식을 사용한다.

서명을 위해서는 signPri.key 파일에서 개인키를 추출해야 하는데 이 부분은 인증서 발급기관 및 인증서 종류 마다 암호화 알고리즘이 다르기 때문에 직접 구현하려고 하기 보다는 공인인증 기관 별 서버 툴킷(유료)의 유틸리티를 활용하여 개인키를 추출하는 것을 권장한다. 직접 ASN1을 사용하여 암호화 알고리즘을 일일이 파악하여 복호화 하는 로직을 구현하려면 고생 좀 해야 한다.

개인키와 비밀번호를 사용하여 전자서명을 수행하였으면 서명에 사용한 원문인 pkcEncSsn와 서명 값을 얻었다.

인증서 로그인을 위한 값은 이 두가지가 전부가 아닌데 인증서의 일련번호와 인증서의 공개키를 byte[] 모양의 DER 타입이 아닌 String 모양의 PEM 타입으로 추출한 값과 개인키의 Random 값이 필요하다.

인증서의 일련번호와 PEM 타입의 값은 서명용 공개키에서 얻을 수 있고, Random 값은 서명용 개인키에서 얻을 수 있다.
Random 값도 signPri.key 파일에서 개인키를 추출하는 과정에서 얻을 수 있기 때문에 직접 구현하기 보다는 공인인증 기관에서 제공하는 서버 툴킷(유료)공인인증 기관 별 서버 툴킷(유료)의 유틸리티를 활용하는 것을 추천한다. 여기까지 왔으면 우리는 아래와 같은 값이 준비가 되었을 것이다.

  1. 서명할 원본 값(pkcEncSsn)
  2. 서명용 공개키에서 얻은 인증서 일련번호
  3. pkcEncSsn 값을 전자서명한 값
  4. 서명용 공개키에서 얻은 PEM 타입의 인증서 문자열
  5. 서명용 개인키에서 얻은 Random 값

이제 위의 값 중 1, 2, 3을 조합해야 하는데 조합방법은 아래와 같다.
1번 값 + ‘$’ +2번 값 + ‘$’ + yyyyMMddHHmmss형식의 오늘날짜 문자열 값 + ‘$’ +3번 값
이렇게 4가지 값이 $ 문자로 구분하여 결합이 되어 나온 값을 다시 Base64 인코딩한 문자열로 변환한다.

이렇게 되면 이제 인증서 로그인 페이지로 넘길 데이터가 준비가 완료가 된 것이다.

인증서 로그인은 아래의 주소로 POST 방식으로 전송한다.
https://www.hometax.go.kr/pubcLogin.do?domain=hometax.go.kr&mainSys=Y

넘길 데이터 항목과 같은 아래와 같다.

파라메터 항목명 비고
cert 서명용 공개키의 PEM 값
logSgnt $로 결합하여 Base64 인코딩한 값
pkcLgnClCd ‘04’ 하드코딩
pkcLoginYnImpv ‘Y’ 하드코딩
randomEnc 서명용 개인키의 Random

 그리고 Request Cookies의 항목과 값은 아래와 같다.

항목명 비고
WMONID pkcEncSsn 얻을 때 받은 쿠키에 있던 값
NTS_LOGIN_SYSTEM_CODE_P ‘TXPP’ 하드코딩
TXPPsessionID pkcEncSsn 얻을 때 받은 쿠키에 있던 값

이렇게 서버로 전송하면 클라이언트 페이지의 콜백 함수를 호출하기 위한 JSON 문자열을 받을 수 있는데 그 값 중에서 decodeURIComponent로 감싸진 부분의 내용이 인증서 로그인에 대한 결과 값이다.

응답 값 예시

{ 'code' : 'S', 'errCode' : null, 'errMsg' : decodeURIComponent('').replace(/\+/g,' ').replace(/\\n/g,'\n'), 'lgnRsltCd' : '01', 'pswdErrNbcnt' : null, 'tin' : null, 'secCardId' : null}

이 값만 추출하여 UTF-8로 URLDecoder 했을 때 한글로 뭐라고 써 있으면 로그인이 실패한 것이고, 값이 없으면 로그인이 성공한 것이다.

하지만 인증서로 로그인이 끝났다고 바로 전자세금계산서 데이터를 얻을 수 있는 것이 아니고 국세청 홈텍스라는 포탈 시스템에 로그인을 막 끝냈을 뿐이다.

이 포탈 안에서 전자세금계산서나 현금영수증 등의 업무별로 시스템이 별도로 존재하며 이런 데이터를 얻기 위해서는 해당 시스템에 SSO 로그인을 위한 추가 작업이 필요하다.

반응형