모바일 운전면허증

개요

  1. 모바일 신분증은 개인 스마트폰에 안전하게 저장하여 편리하게 사용할 수 있는 신분증으로 신분증이 필요한 모든 곳에서 편리하게 사용할 수 있다.
  2. 개인이 스마트폰 안에 자신의 정보를 보유하고 직접 꺼내 쓰며, 신원 증명을 위해 필요한 정보만 골라서 제공할 수 있어 자기 정보 결정권이 강화된다.
  3. 내 신원 정보는 내 스마트폰 안에만 안전하게 보관되며, 블록체인을 통해 신원 정보의 진위 여부를 확인할 수 있다.
  4. 모바일 신분증 하나로 오프라인과 온라인에서 간편하고 안전하게 사용할 수 있다.
  5. 모바일 운전면허증은 한국조폐공사장으로 연계 서비스 신청서 공문을 접수하여 심의 승인 후 연계 서비스를 개발한다.
  6. 표준프레임워크는 연계모듈을 이용한 애플리케이션 개발에 활용할 수 있는 예제를 제공한다.

연계서비스 이용절차

  1. 모바일 신분증 개발지원센터에서 모바일 신분증 연계신청서 다운로드 및 작성.
  2. 수신처 한국조폐공사장으로 공문 접수.
  3. 심의 결과에 따른 승인/보완/반려 처리.
  4. 승인 후 연계서비스 개발.

설명

관련소스

유형대상소스명비고
DAOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.dao.SvcDAO.java서비스 처리
DAOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.dao.TrxInfoDAO.java거래 처리
Enumjava.egovframework.com.sec.rnc.mip.mva.sp.comm.enums.AuthTypeEnum.java상수 집합
Enumjava.egovframework.com.sec.rnc.mip.mva.sp.comm.enums.MipErrorEnum.java상수 집합
Enumjava.egovframework.com.sec.rnc.mip.mva.sp.comm.enums.ModeEnum.java상수 집합
Enumjava.egovframework.com.sec.rnc.mip.mva.sp.comm.enums.PresentTypeEnum.java상수 집합
Enumjava.egovframework.com.sec.rnc.mip.mva.sp.comm.enums.RequestTypeEnum.java상수 집합
Enumjava.egovframework.com.sec.rnc.mip.mva.sp.comm.enums.TrxStsCodeEnum.java상수 집합
Enumjava.egovframework.com.sec.rnc.mip.mva.sp.comm.enums.VcStatusEnum.java상수 집합
Exceptionjava.egovframework.com.sec.rnc.mip.mva.sp.comm.exception.SpException.java예외 처리
Exceptionjava.egovframework.com.sec.rnc.mip.mva.sp.comm.exception.SpExceptionHandler.java예외 처리
Servicejava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.DirectService.java다이렉트 모드 처리
Servicejava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.MipDidVpService.javaDID 검증 처리
Servicejava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.MipProperties.java프로퍼티 처리
Servicejava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.SvcService.java서비스 처리
Servicejava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.TrxInfoService.java거래 처리
ServiceImpljava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.impl.DirectServiceImpl.java다이렉트 모드 처리
ServiceImpljava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.impl.MipDidVpServiceImpl.javaDID 검증 처리
ServiceImpljava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.impl.SvcServiceImpl.java서비스 처리
ServiceImpljava.egovframework.com.sec.rnc.mip.mva.sp.comm.service.impl.TrxInfoServiceImpl.java거래 처리
Utiljava.egovframework.com.sec.rnc.mip.mva.sp.comm.util.Base64Util.javaBase64 유틸
Utiljava.egovframework.com.sec.rnc.mip.mva.sp.comm.util.Generator.javaGenerator 유틸
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.M200VO.javaVP 요청 메시지 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.M310VO.javaProfile 요청 메시지 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.M400VO.javaVP 제출 메시지 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.M900VO.java오류 메시지 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.MipApiDataVO.java검증 API 데이터 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.SvcVO.java검증 서비스 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.T510VO.javaQR-MPM 시작용 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.TrxInfoSvcVO.java거래 & 서비스 정보 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.TrxInfoVO.java거래 정보 VO
VOjava.egovframework.com.sec.rnc.mip.mva.sp.comm.vo.VP.javaVP 정보 VO
Controllerjava.egovframework.com.sec.rnc.mip.mva.sp.comm.web.MipController.javaMIP 검증 처리
Configjava.egovframework.com.sec.rnc.mip.mva.sp.config.ConfigBean.java환경 설정 파일
Servicejava.egovframework.com.sec.rnc.mip.mva.sp.qrmpm.service.QrmpmService.javaQR-MPM 인터페이스 검증 처리
ServiceImpljava.egovframework.com.sec.rnc.mip.mva.sp.qrmpm.service.impl.QrmpmServiceImpl.javaQR-MPM 인터페이스 검증 처리
Controllerjava.egovframework.com.sec.rnc.mip.mva.sp.qrmpm.web.QrmpmController.javaQR-MPM 인터페이스 검증 처리
Controllerjava.egovframework.com.sec.rnc.mip.mva.sp.qrmpm.web.QrmpmViewController.javaQR-MPM 화면 이동
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_altibase.xml서비스 처리 Altibase Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_cubrid.xml서비스 처리 Cubrid Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_goldilocks.xml서비스 처리 Goldilocks Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_maria.xml서비스 처리 Maria Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_mysql.xml서비스 처리 Mysql Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_oracle.xml서비스 처리 Oracle Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_postgres.xml서비스 처리 Postgres Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/SERVICE_SQL_tibero.xml서비스 처리 Tibero Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_altibase.xml거래 처리 Altibase Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_cubrid.xml거래 처리 Cubrid Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_goldilocks.xml거래 처리 Goldilocks Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_maria.xml거래 처리 Maria Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_mysql.xml거래 처리 Mysql Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_oracle.xml거래 처리 Oracle Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_postgres.xml거래 처리 Postgres Mapper
XMLresources/egovframework/mapper/com/sec/rnc/mip/TRX_INFO_SQL_tibero.xml거래 처리 Tibero Mapper
Propertyresources/egovframework/message/com/cmm/message-common_en.properties메시지 처리
Propertyresources/egovframework/message/com/cmm/message-common_ko.properties메시지 처리
연계용 환경설정resources/egovframework/mip/mip.properties환경 설정 파일
연계용 모듈resources/egovframework/mip/sp.did개인 식별 문서
연계용 모듈resources/egovframework/mip/sp.wallet개인 식별 키를 담은 암호화 지갑
SCRIPTscript/comment/altibase/egov_altibase_comment.sqlAltibase 코멘트 Script
SCRIPTscript/comment/cubrid/egov_cubrid_comment.sqlCubrid 코멘트 Script
SCRIPTscript/comment/goldilocks/egov_goldilocks_comment.sqlGoldilocks 코멘트 Script
SCRIPTscript/comment/maria/egov_maria_comment.sqlMaria 코멘트 Script
SCRIPTscript/comment/mysql/egov_mysql_comment.sqlMysql 코멘트 Script
SCRIPTscript/comment/oracle/egov_oracle_comment.sqlOracle 코멘트 Script
SCRIPTscript/comment/postgres/egov_postgres_comment.sqlPostgres 코멘트 Script
SCRIPTscript/comment/tibero/egov_tibero_comment.sqlTibero 코멘트 Script
SCRIPTscript/ddl/altibase/com_DDL_altibase.sqlAltibase DDL Script
SCRIPTscript/ddl/cubrid/com_DDL_cubrid.sqlCubrid DDL Script
SCRIPTscript/ddl/goldilocks/com_DDL_goldilocks.sqlGoldilocks DDL Script
SCRIPTscript/ddl/maria/com_DDL_maria.sqlMaria DDL Script
SCRIPTscript/ddl/mysql/com_DDL_mysql.sqlMysql DDL Script
SCRIPTscript/ddl/oracle/com_DDL_oracle.sqlOracle DDL Script
SCRIPTscript/ddl/postgres/com_DDL_postgres.sqlPostgres DDL Script
SCRIPTscript/ddl/tibero/com_DDL_tibero.sqlTibero DDL Script
SCRIPTscript/dml/altibase/com_DML_altibase.sqlAltibase DML Script
SCRIPTscript/dml/cubrid/com_DML_cubrid.sqlCubrid DML Script
SCRIPTscript/dml/goldilocks/com_DML_goldilocks.sqlGoldilocks DML Script
SCRIPTscript/dml/maria/com_DML_maria.sqlMaria DML Script
SCRIPTscript/dml/mysql/com_DML_mysql.sqlMysql DML Script
SCRIPTscript/dml/oracle/com_DML_oracle.sqlOracle DML Script
SCRIPTscript/dml/postgres/com_DML_postgres.sqlPostgres DML Script
SCRIPTscript/dml/tibero/com_DML_tibero.sqlTibero DML Script
CSSwebapp/css/egovframework/com/sec/rnc/mip/common.css공통 css
CSSwebapp/css/egovframework/com/sec/rnc/mip/style.css디자인 css
Imagewebapp/images/egovframework/com/sec/rnc/mip/bg/bg-select.svg화면 구성 이미지 파일
Imagewebapp/images/egovframework/com/sec/rnc/mip/bg/sample-qrcode.png화면 구성 이미지 파일
Imagewebapp/images/egovframework/com/sec/rnc/mip/icon/ic-calendar.svg화면 구성 이미지 파일
Imagewebapp/images/egovframework/com/sec/rnc/mip/icon/ic-sub-tit.svg화면 구성 이미지 파일
JSwebapp/js/egovframework/com/sec/rnc/mip/comm/base64.min.jsBase64 js
JSwebapp/js/egovframework/com/sec/rnc/mip/comm/common.js공통 js
JSwebapp/js/egovframework/com/sec/rnc/mip/comm/jquery-3.6.0.jsjQuery js
JSwebapp/js/egovframework/com/sec/rnc/mip/comm/jsQR.jsQR js
JSwebapp/js/egovframework/com/sec/rnc/mip/comm/qrcode.jsQR js
JSwebapp/js/egovframework/com/sec/rnc/mip/qrmpm.jsQR-MPM 화면 js
DispatcherServletwebapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xmljson 맵핑용 Message Converter Bean 추가
JSPwebapp/WEB-INF/jsp/egovframework/com/sec/rnc/mip/comm/header.jspcss, js 추가
JSPwebapp/WEB-INF/jsp/egovframework/com/sec/rnc/mip/comm/trxsts.jsp거래 처리 화면
JSPwebapp/WEB-INF/jsp/egovframework/com/sec/rnc/mip/qrmpm/qrmpmView.jspQR-MPM 검증 화면
연계용 모듈webapp/WEB-INF/lib/OmniEnt-SDK-Core-v1.0.3.5-nolicensecheck.jar모바일 운전면허증 라이브러리
연계용 모듈webapp/WEB-INF/lib/OmniEnt-SDK-ServerCore-v1.0.3.5.jar모바일 운전면허증 라이브러리
연계용 모듈webapp/WEB-INF/lib/OmniEnt-SDK-Verifier-v1.0.3.6.jar모바일 운전면허증 라이브러리
연계용 모듈webapp/WEB-INF/lib/RSLicenseSDK_jdk16_1.0.4.jar모바일 운전면허증 라이브러리
연계용 환경설정pom.xml모바일 운전면허증 라이브러리 및 Util Dependency 추가

관련테이블

테이블명테이블명(영문)비고
SP 서비스COMTCMOBILEIDSERVICESP 서비스 정보를 관리한다.
SP 거래정보COMTSMOBILEIDTRXINFOSP 거래 정보를 관리한다.

환경설정

  1. 위키가이드의 공통컴포넌트 시작하기를 참고하여 공통컴포넌트를 설치한다.
  2. 모바일 운전면허증 서비스 신청 승인 후 생성한 DID Document 및 Wallet 파일을 공통컴포넌트 프로젝트에 추가한다.
    • 추가할 위치는 위의 관련소스 부분을 참고한다.
  3. mip.properties 파일에 개발환경에 맞게 환경설정한다.
#################################################################################
# Server Settings
#################################################################################
# blockchain node address : 블록체인 노드 주소(모바일 운전면허증에서 제공)
app.blockchain-server-domain=https://bcdev.mobileid.go.kr:18888
# SP Server Address
# 사용자(Client)에서 접근할 수 있는 검증자(Service Provider)의 IP Address : SP 서버 주소
app.sp-server=http://192.168.xxx.xxx:8080/egovframework-all-in-one


#################################################################################
# SP & Wallet
#################################################################################
# Wallet file path : 생성한 신분증 월렛 파일 경로
app.keymanager-path=/eGovFrameDev-4.1.0-64bit/workspace/egovframework-all-in-one-AllNew/src/main/resources/egovframework/mip/****.wallet
# Wallet password : 생성 시 설정했던 신분증 월렛 패스워드
app.keymanager-password=****
# ECC key id : 생성 시 설정했던 sp key
app.sp-key-id=****.sp
# RSA key id : 생성 시 설정했던 rsa key
app.sp-rsa-key-id=****.sp.rsa
# SP blockchain account (SP 서비스 신청 승인 시 발급) : 모바일 운전면허증에서 발급
app.sp-account=****.sp
# SP DID file path : 생성한 DID Document 파일 경로
app.sp-did-path=/eGovFrameDev-4.1.0-64bit/workspace/egovframework-all-in-one-AllNew/src/main/resources/egovframework/mip/****.did

연계 구성

  1. 모바일 신분증 개발지원센터에서 안내하는 연계 서비스 이용 절차에 따라 공문 접수 및 승인 후 DID 및 Wallet 파일을 생성하여 표준프레임워크 예제에 추가해 서비스 예제를 구성한다.
  2. 표준프레임워크 공통컴포넌트에서 제공하는 모바일 운전면허증 연계 서비스 예제는 QR-MPM - direct mode 방식으로 연동 프로세스는 연계 순서도를 통해 확인할 수 있다.

관련 기능

QR 코드 생성

비즈니스 규칙

SP 서버 정보와 트랜잭션 정보 등이 포함되어 있는 QR 코드를 요청하여 생성한다.

관련코드

/**
 * QR-MPM 시작
 * 
 * @MethodName : start
 * @param t510 QR-MPM 정보
 * @return QR-MPM 정보 + Base64로 인코딩된 M200 메시지
 * @throws SpException
 */
@Override
public T510VO start(T510VO t510) throws SpException {
	LOGGER.debug("t510 : {}", ConfigBean.gson.toJson(t510));
 
	String mode = t510.getMode();
	String svcCode = t510.getSvcCode();
	String branchName = t510.getBranchName();
	String deviceId = t510.getDeviceId();
 
	if (ObjectUtils.isEmpty(mode))
		throw new SpException(MipErrorEnum.SP_MISSING_MANDATORY_ITEM, null, "t510.mode");
	if (ObjectUtils.isEmpty(svcCode))
		throw new SpException(MipErrorEnum.SP_MISSING_MANDATORY_ITEM, null, "t510.svcCode");
	if (ObjectUtils.isEmpty(branchName))
		throw new SpException(MipErrorEnum.SP_MISSING_MANDATORY_ITEM, null, "t510.branchName");
	if (ObjectUtils.isEmpty(deviceId))
		throw new SpException(MipErrorEnum.SP_MISSING_MANDATORY_ITEM, null, "t510.deviceId");
 
	TrxInfoVO trxInfo = new TrxInfoVO();
 
	trxInfo.setMode(mode);
	trxInfo.setSvcCode(svcCode);
	trxInfo.setBranchName(branchName);
	trxInfo.setDeviceId(deviceId);
 
	M200VO m200 = null;
 
	if (ModeEnum.DIRECT.getVal().equals(mode)) {
		m200 = this.directStart(trxInfo);
	} else {
		throw new SpException(MipErrorEnum.UNKNOWN_ERROR, null, "unsupported mode");
	}
 
	String m200Str = ConfigBean.gson.toJson(m200);
 
	LOGGER.debug("m200Str : {}", m200Str);
 
	String m200Base64 = Base64Util.encode(m200Str);
 
	t510.setM200Base64(m200Base64);
 
	return t510;
}
 
/**
 * QR-MPM 시작(Direct 모드)
 * 
 * @MethodName : directStart
 * @param trxInfo
 * @return
 * @throws SpException
 */
private M200VO directStart(TrxInfoVO trxInfo) throws SpException {
	String spServer = configBean.getSpServer();
 
	String trxcode = Generator.genTrxcode();
	String mode = trxInfo.getMode();
 
	if (trxcode == null) {
		throw new SpException(MipErrorEnum.UNKNOWN_ERROR, null, "거래코드 생성 실패");
	}
 
	trxInfo.setTrxcode(trxcode);
 
	trxInfoService.registTrxInfo(trxInfo);
 
	M200VO m200 = new M200VO();
 
	m200.setType(ConfigBean.TYPE);
	m200.setVersion(ConfigBean.VERSION);
	m200.setCmd(ConfigBean.M200);
	m200.setTrxcode(trxcode);
	m200.setMode(mode);
	m200.setHost(spServer);
 
	return m200;
}
  • 모바일 운전면허증 QR 정보 요청 화면 예

사용자 검증

비즈니스 규칙

모바일 신분증 어플리케이션을 통한 QR 촬영으로 모바일 신분증 내 VP를 검증자에게 직접 전달하여 사용자 검증을 진행한다.

관련코드

/**
 * VP 검증
 * 
 * @MethodName : verifyVP
 * @param trxcode 거래코드
 * @param vp VP 정보
 * @return 검증 결과
 * @throws SpException
 */
@Override
public Boolean verifyVP(String trxcode, VP vp) throws SpException {
	LOGGER.debug("trxcode : {}, vp : {}", trxcode, ConfigBean.gson.toJson(vp));
 
	Boolean result = false;
 
	TrxInfoVO trxInfo = new TrxInfoVO();
 
	trxInfo.setTrxcode(trxcode);
	trxInfo.setTrxStsCode(TrxStsCodeEnum.VERIFY_REQ.getVal());
 
	trxInfoService.modifyTrxInfo(trxInfo);
 
	Integer encryptType = vp.getEncryptType();
	Integer keyType = vp.getKeyType();
	String type = vp.getType();
	String data = vp.getData();
	List<String> authType = vp.getAuthType();
	String did = vp.getDid();
	String nonce = vp.getNonce();
 
	// VP 검증 Start
	VCVerifyProfileResult vCVerifyProfileResult = new VCVerifyProfileResult();
 
	vCVerifyProfileResult.setEncryptType(encryptType);
	vCVerifyProfileResult.setKeyType(keyType);
	vCVerifyProfileResult.setType(type);
	vCVerifyProfileResult.setData(data);
 
	vCVerifyProfileResult.setAuthType(authType);
	vCVerifyProfileResult.setDid(did);
	vCVerifyProfileResult.setNonce(nonce);
 
	ResultJson resultJson = this.verify(vCVerifyProfileResult, trxcode);
 
	if (resultJson == null || !resultJson.isResult()) {
		return result;
	}
	// VP 검증 End
 
	// VP 상태 확인 Start
	Map<String, Object> vpDataMap = null;
 
	EncryptKeyTypeEnum keyTypeEnum = EncryptKeyTypeEnum.getEnum(vCVerifyProfileResult.getKeyType());
 
	if (keyTypeEnum == EncryptKeyTypeEnum.ALGORITHM_RSA) {
		try {
			AESType aESType = vCVerifyProfileResult.getEncryptType() == 1 ? AESType.AES128 : AESType.AES256;
 
			byte[] vpDataByte = keyManager.rsaDecrypt(configBean.getSpRsaKeyId(), HexUtils.toBytes(vCVerifyProfileResult.getData()), aESType);
 
			data = new String(vpDataByte, StandardCharsets.UTF_8);
 
			LOGGER.debug("data : {}", data);
		} catch (IWException e) {
			throw new SpException(MipErrorEnum.UNKNOWN_ERROR, trxcode, e.getErrorMsg());
		}
	}
 
	try {
		vpDataMap = ConfigBean.gson.fromJson(data, HashMap.class);
	} catch (JsonSyntaxException e) {
		throw new SpException(MipErrorEnum.SP_UNEXPECTED_MSG_FORMAT, trxcode, "data");
	}
 
	List<Map<String, Object>> verifiableCredentialList = (List<Map<String, Object>>) vpDataMap.get("verifiableCredential");
 
	if (ObjectUtils.isEmpty(verifiableCredentialList)) {
		throw new SpException(MipErrorEnum.SP_UNEXPECTED_MSG_FORMAT, trxcode, "vp");
	}
 
	Map<String, Object> verifiableCredential = verifiableCredentialList.get(0);
 
	String vcId = (String) verifiableCredential.get("id");
 
	ResultVcStatus resultVcStatus = null;
 
	try {
		resultVcStatus = this.getVCStatus(vcId);
	} catch (BlockChainException e) {
		throw new SpException(MipErrorEnum.UNKNOWN_ERROR, trxcode, e.getErrorMsg());
	}
 
	String vcStatus = resultVcStatus.getVcStatus();
 
	if (vcStatus.equalsIgnoreCase(VcStatusEnum.ACTIVE.getVal())) { // 활성화 상태
		result = true;
	} else if (vcStatus.equalsIgnoreCase(VcStatusEnum.NEED_RENEW.getVal())) { // 갱신필요 상태
		String memo = resultVcStatus.getMemo();
 
		if (memo.equals("주소변경")) {
			result = true;
		} else {
			throw new SpException(MipErrorEnum.UNKNOWN_ERROR, trxcode, "제출불가 상태 : " + vcStatus + "(" + memo + ")");
		}
	} else {
		throw new SpException(MipErrorEnum.UNKNOWN_ERROR, trxcode, "제출불가 상태 : " + vcStatus);
	}
	// VP 상태 확인 End
 
	// Nonce 위변조 확인 Start
	TrxInfoVO curTrxInfo = trxInfoService.getTrxInfo(trxcode);
 
	if (curTrxInfo == null) {
		throw new SpException(MipErrorEnum.SP_TRXCODE_NOT_FOUND, trxcode);
	}
 
	String curVpVerifyResult = curTrxInfo.getVpVerifyResult();
 
	// 이미 verify 된 trx
	if ("Y".equals(curVpVerifyResult)) {
		throw new SpException(MipErrorEnum.SP_MSG_SEQ_ERROR, trxcode, "verifyResult == Y");
	}
 
	String profileNonce = curTrxInfo.getNonce();
 
	// 일반인증시 proof를 사용하고 안심인증시 proofs를 사용
	Map<String, Object> proof = (Map<String, Object>) vpDataMap.get("proof");
	List<Map<String, Object>> proofs = (List<Map<String, Object>>) vpDataMap.get("proofs");
 
	if (ObjectUtils.isEmpty(proof) && ObjectUtils.isEmpty(proofs)) {
		throw new SpException(MipErrorEnum.SP_UNEXPECTED_MSG_FORMAT, trxcode, "proof");
	}
 
	if (!ObjectUtils.isEmpty(proof)) {
		String vpNonce = (String) proof.get("nonce");
 
		LOGGER.debug("profileNonce : {}, vpNonce : {}", profileNonce, vpNonce);
 
		if (!profileNonce.equals(vpNonce)) {
			throw new SpException(MipErrorEnum.SP_MISMATCHING_NONCE, trxcode);
		}
	}
 
	if (!ObjectUtils.isEmpty(proofs)) {
		for (Map<String, Object> obj : proofs) {
			String vpNonce = (String) obj.get("nonce");
 
			LOGGER.debug("profileNonce : {}, vpNonce : {}", profileNonce, vpNonce);
 
			if (!profileNonce.equals(vpNonce)) {
				throw new SpException(MipErrorEnum.SP_MISMATCHING_NONCE, trxcode);
			}
		}
	}
	// Nonce 위변조 확인 End
 
	String vpVerifyResult = result ? "Y" : "N";
 
	trxInfo.setTrxcode(trxcode);
	trxInfo.setTrxStsCode(TrxStsCodeEnum.VERIFY_COM.getVal());
	trxInfo.setVpVerifyResult(vpVerifyResult);
 
	// VP 정보 추출 및 저장
	if(result) {
		Map<String, Object> credentialSubject = (Map<String, Object>) verifiableCredentialList.get(8).get("credentialSubject");
		List<Map<String, Object>> privacy = (List<Map<String, Object>>) credentialSubject.get("privacy");
		trxInfo.setVpName((String) privacy.get(0).get("value"));
	}
	// VP 정보 추출 및 저장 End
 
	trxInfoService.modifyTrxInfo(trxInfo);
 
	return result;
}

검증 결과 조회

비즈니스 규칙

트랜잭션 처리 정보를 조회한다.

관련코드

/**
 * 거래상태 조회
 * 
 * @param mipApiData {"data":"Base64로 인코딩된 TrxInfoVO"}
 * @return {"result":true, "data":"Base64로 인코딩된 TrxInfoVO"}
 * @throws SpException
 */
@RequestMapping(value = "/trxsts")
public MipApiDataVO getTrxsts(@RequestBody MipApiDataVO mipApiData) throws SpException {
	LOGGER.debug("거래상태 조회!");
 
	String data = Base64Util.decode(mipApiData.getData());
 
	TrxInfoVO trxInfo = null;
 
	try {
		trxInfo = ConfigBean.gson.fromJson(data, TrxInfoVO.class);
	} catch (JsonSyntaxException e) {
		throw new SpException(MipErrorEnum.SP_UNEXPECTED_MSG_FORMAT, null, "trxInfo");
	}
 
	trxInfo = trxInfoService.getTrxInfo(trxInfo.getTrxcode());
 
	mipApiData.setResult(true);
	mipApiData.setData(Base64Util.encode(ConfigBean.gson.toJson(trxInfo)));
 
	return mipApiData;
}
  • 모바일 운전면허증 트랜잭션 정보 조회 예

 
egovframework/com/v4.1/sec/모바일_운전면허증.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki