디지털원패스

2022. 12. 30. 13:34·STUDY/ETC
반응형
  • 디지털원패스 : 하나의 아이디로 본인이 선택한 인증 수단을 사용하여 안전하고 편리하게 여러 전자 정부 서비스(정부24, 고용노동부, 교육부 등)를 이용할 수 있는 인증 서비스
  • 사용방법
    • 디지털원패스에 가입 후 전자 정부 서비스에서 디지털원패스 사용 가능
    • 디지털원패스에 사용자가 제공하는 정보 : 이름, 이메일, 휴대폰번호, 생년월일

정부24 로그인 화면(gov.kr -> onepass.go.kr)
ID 확인 & 디지털원패스 가입시 설정한 인증방법(인증번호)

  • 인증방법
    1. 모바일 인증(지문, 안면, 패턴, PIN, 공동인증서)
    2. 공동인증서(PC)
    3. SMS 등
  • 행정안전부 디지털원패스를 가입해야 사용 가능
  • 연계방법 : https://www.onepass.go.kr/cnguide (신청-적용-검토후 오픈)

디지털 원패스 연계 방법(상세 - 신청하기)
디지털 원패스 연계 방법(상세 - 적용하기)
디지털 원패스 연계 방법(상세 - 적용 후 오픈)

  • 연계적용 가이드
    • 기존 회원과 디지털원패스 회원 매핑
      • 사용자 식별값을 CI로 사용하는 경우 : User Key 유무를 통해 있으면 바로 로그인 처리/ 없다면 기존회원의 CI에 디지털원패스 정보를 매핑 후 등록한 뒤 로그인 처리
      • 사용자 식별값을 DI로 사용하는 경우 : User Key 유무를 통해 있으면 바로 로그인 처리/ 없다면 DI생성수단을 통해 생성된 DI와 CI, 디지털원패스 정보 등록 후 로그인 처리

* CI : Connecting Information (연계정보) – 본인 확인기관 등에서 개인별로 고유하게 부여하는 개인 식별정보

  어느 업체에서 발급해도 유일하게 발급되므로 이 값이 같으면 동일인으로 판단할 수 있음

  주민등록번호 수집이 금지되면서 인터넷 서비스 업체에서는 휴대폰 본인인증, 공인인증, 신용카드 인증을 통해 CI를 제공받고 있으며

  주민등록번호를 대신해 고객을 구별하는 데이터로 사용

*DI : Duplication Information (중복정보, 중복가입확인정보) – 인증업체별로 사용자에게 부여하는 고유번호

 동일인이라 해도 인증업체가 다르면 DI가 다름

 한 사람이 여러 개의 계정을 만드는 것을 방지하고자 만들어짐

  •  주의사항
    • 디지털원패스 연계는 신규 회원가입이 아니기 때문에 로그인 연결에 대한 동의절차의 추가정보 입력화면에서 별도의 비밀번호를 입력받으면 안됨 (미준수 시 연계 오픈이 제한될 수도 있음)
    • 디지털원패스에서 제공하는 이름, 생년월일, 전화번호 같은 사용자 정보를 입력(수정) 금지
    • 필수 정보 중 디지털원패스에서 제공하지 않는 정보만 수집(선택 정보 제외)
    • 선택정보는 나의 정보화면 혹은 필요한 시점에서 입력받기를 권장
  • 적용사례
    1. 회원(아이디) 로그인
      • KTV국민방송 http://www.ktv.go.kr/ (아이디, 공인인증서)
      • 1365자원봉사 포털 https://www.1365.go.kr/(간편인증, SNS, 아이디)
    2. 비회원(본인확인) 로그인
      • 대한법률구조공단  https://www.klac.or.kr/
      • 당진시 http://www.dangjin.go.kr/

 

원패스 properties 예제

# Site URL : 사이트의 URL
onepass.site.url=https://10.211.55.3:9443/egovframework-all-in-one/
# Site ID : 사이트의 ID(디지털원패스에서 발급)
onepass.site.id=**********
# AES secretKey(length:16) : AES 암호화 키(디지털원패스에서 발급)
aes.secretKey=**********
# PublicKey path(절대경로)
keys.public.path=C:\\eGovFrameDev-4.0.0-64bit\\workspace\\allinone\\src\\main\\resources\\egovframework\\onepass\\pubkey_share.der
# SSL jks path(상대경로)
ssl.keystore=egovframework/onepass/onepass.jks
# ACS path : SAML로그인 요청 후 응답처리 경로(사이트의 로그인 처리를 위한 경로)
onepass.site.path.acs=/uat/uia/onepass/onepassCallback.do
# IDP URL : 디지털원패스 IDP URL
onepass.idp.url=https://saml.egaf2017.com
# Potal URL : API 서버 URL
onepass.potal.url=https://www.egaf2017.com

 

  • 사용자 인증 처리 예시 : 인증화면으로 이동
    • 서비스 타입 : LOGIN, LOGOUT
@RequestMapping(value="/uat/uia/onepass/onepassLogin.do", method=RequestMethod.POST)
public String onepassLogin(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
	String serviceType = request.getParameter("serviceType");
	String action = null;
	String inputName = null;
	String inputValue = null;
	String pageType = OnepassRequestHandler.pageType(request);
 
	try {
		if ("LOGIN".equals(serviceType)) {
			action = OnepassRequestHandler.LOGIN_DEST;
			inputName = OnepassRequestHandler.LOGIN_INPUT_NAME;
			inputValue = OnepassRequestHandler.login();
		} else if ("LOGOUT".equals(serviceType)) {
			action = OnepassRequestHandler.logoutDest(request);
			inputName = OnepassRequestHandler.LOGOUT_INPUT_NAME;
			inputValue = OnepassRequestHandler.logout(request);
		} else {
			action = request.getContextPath()+"/index.do";
			inputName = "";
			inputValue = "";
		}
	} catch (Exception e) {
		return "egovframework/com/cmm/error/onepassAccessDenied";
	}
 
	model.addAttribute("redirectUrl", action);
	model.addAttribute("inputName", inputName);
	model.addAttribute("inputValue", inputValue);
	model.addAttribute("pageType", pageType);
 
	return "egovframework/com/uat/uia/onepass/onepassLogin";
}

 

  • 인증완료 후 응답 처리 예시 : 인증 완료 휴 응답받는 callback 메소드로 인증된 사용자 정보 처리
    • intfToken 과 userKey로 사용자 정보 조회
@RequestMapping(value="/uat/uia/onepass/onepassCallback.do", method=RequestMethod.POST)
public String onepassCallback(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception {
	// 인증체크
	OnepassResponse onepassResponse = OnepassResponseHandler.check(request);
 
	// 인증 성공
	if (onepassResponse.getStatus() == STATUS.SUCCESS  && onepassResponse.getResultCode() == RESULT_CODE.SUCCESS) {
 
		// type 이 LOGIN
		if (onepassResponse.getType() == TYPE.LOGIN) {
			String userKey = onepassResponse.getUserKey();
			String intfToken = onepassResponse.getIntfToken();
 
			// 인증 후 사용자 정보 조회
			ApiSendHandler apiSendHandler = new ApiSendHandler();
			OnepassUserResponse findOnepassUser = apiSendHandler.findUser(userKey, intfToken);
 
			// 사용자 정보 조회 성공
			if (findOnepassUser != null && findOnepassUser.getStatus() == USER_STATUS.USE) {
 
				// 디지털원패스 사용자 정보 - 신규회원일 경우 이 정보를 이용할 수 있음
				LOGGER.info("getId:{}", findOnepassUser.getId()); // 사용자의 ID (최대 30자)
				LOGGER.info("getName:{}", findOnepassUser.getName()); // 사용자의 이름 (최대 70자)
				LOGGER.info("getUserKey:{}", findOnepassUser.getUserKey()); // 사용자 유일값인 user key 가 전달된다. (최대 50자)
				LOGGER.info("getCi:{}", findOnepassUser.getCi()); // 사용자의 CI (최대 255자)
				LOGGER.info("getBirth:{}", findOnepassUser.getBirth()); // 사용자의 생년월일 (최대 8자)
				LOGGER.info("getPhone:{}", findOnepassUser.getPhone()); // 사용자의 휴대전화번호 (최대 14자)
				LOGGER.info("getEmail:{}", findOnepassUser.getEmail()); // 사용자의 E-mail (최대 70자)
				LOGGER.info("getSex:{}", findOnepassUser.getSex()); // 사용자의 성별 (남:M, 여:F)
				LOGGER.info("getNation:{}", findOnepassUser.getNation()); // 내외국인 구분(내국인:L, 외국인:F)
 
				// 기관 아이디 조회
				int usedCnt = egovOnepassService.onePassCheckIdDplct(findOnepassUser.getId());
 
				// 기관 아이디 조회 성공
				if (usedCnt > 0) {
					// 디지털원패스에서 받은 아이디로 회원정보 조회 후 세션 저장
					LoginVO resultVO = loginService.onepassLogin(findOnepassUser.getId());
					resultVO.setOnepassUserkey(userKey);
					resultVO.setOnepassIntfToken(intfToken);
					request.getSession().setAttribute("loginVO", resultVO);
 
					// 로그인 인증세션 추가
					request.getSession().setAttribute("accessUser", resultVO.getUserSe().concat(resultVO.getId()));
					model.addAttribute("resultMessage", egovMessageSource.getMessageArgs("digital.onepass.connect.success", new Object[]{resultVO.getId()}));
					model.addAttribute("redirectUrl", request.getContextPath()+"/index.do");
					return "egovframework/com/uat/uia/onepass/onepassResult";
				}
				// 기관 아이디 조회 실패
				else {
					model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.join.failure"));
					model.addAttribute("redirectUrl", request.getContextPath()+"/index.do");
					return "egovframework/com/uat/uia/onepass/onepassResult";
				}
			}
			// 사용자 정보 조회 실패
			else {
				model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.user.infomation.failure"));
				model.addAttribute("redirectUrl", request.getContextPath()+"/index.do");
				return "egovframework/com/uat/uia/onepass/onepassResult";
			}
		}
		// type 이 LOGIN 이 아님
		else {
			model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.athentication.failure"));
			model.addAttribute("redirectUrl", request.getContextPath()+"/index.do");
			return "egovframework/com/uat/uia/onepass/onepassResult";
		}
	}
	// 인증 실패
	else {
		model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.athentication.failure"));
		model.addAttribute("redirectUrl", request.getContextPath()+"/index.do");
		return "egovframework/com/uat/uia/onepass/onepassResult";
	}
}
  • 응답 메시지 
digital.onepass.connect.success 기관 아이디 조회 성공
digital.onepass.connect.join.failure 기관 아이디 조회 실패
digital.onepass.connect.user.infomation.failure 사용자 정보 조회 실패
digital.onepass.connect.athentication.failure TYPE 이 LOGIN이 아님
digital.onepass.connect.athentication.failure 인증 실패
  • 사용 가능 정보(디지털 원패스에서 가져오는 정보)
id 사용자의 ID
name 사용자의 이름
userKey 사용자의 유일값(user key)
ci 사용자의 Ci
birth 사용자의 생년월일
phone 사용자의 휴대전화번호
email 사용자의 E-mail
sex 사용자의 성별
nation 내외국인 구분(내국인 : L, 외국인 : F)

 

  • 연동해제 예시 : 디지털원패스와의 연동을 해제
@RequestMapping(value="/uat/uia/onepass/onepassCancel.do", method=RequestMethod.POST)
public String onepassCancel(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception {
	ApiSendHandler apiSendHandler = new ApiSendHandler();
	String userKey = request.getParameter("userKey");
	String intfToken = request.getParameter("intfToken");
 
	OnepassUserResponse onepassUser = apiSendHandler.InterLockRelease(userKey, intfToken);
 
	if (Objects.isNull(onepassUser)) {
		onepassUser = new OnepassUserResponse();
		model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.athentication.failure"));
		model.addAttribute("redirectUrl", request.getContextPath()+"/uat/uia/actionLogout.do");
		return "egovframework/com/uat/uia/onepass/onepassResult";
	} else {
		if (onepassUser.getProcess_result() == PROCESS_RESULT.SUCESS) {
			model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.disconnect.success"));
			model.addAttribute("redirectUrl", request.getContextPath()+"/uat/uia/actionLogout.do");
			return "egovframework/com/uat/uia/onepass/onepassResult";
		} else {
			model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.user.infomation.failure"));
			model.addAttribute("redirectUrl", request.getContextPath()+"/uat/uia/actionLogout.do");
			return "egovframework/com/uat/uia/onepass/onepassResult";
		}
	}
}

 

 

반응형
저작자표시 (새창열림)

'STUDY > ETC' 카테고리의 다른 글

http와 멱등성  (0) 2025.07.09
TCP/IP 정리  (0) 2024.05.22
슬랙 권한 정리  (1) 2023.01.31
SNS 소셜 로그인(카카오로그인)  (0) 2023.01.05
'STUDY/ETC' 카테고리의 다른 글
  • http와 멱등성
  • TCP/IP 정리
  • 슬랙 권한 정리
  • SNS 소셜 로그인(카카오로그인)
3unB
3unB
  • 3unB
    ILLILI
    3unB
  • 전체
    오늘
    어제
    • 분류 전체보기 (153) N
      • STUDY (109) N
        • JAVA (31) N
        • SPRING (29)
        • JSP (11)
        • DATABASE (19)
        • HTML (0)
        • CSS (4)
        • GITHUB (2)
        • ETC (5) N
        • 자격증 (1)
        • ERROR (6)
      • PROJECT (6)
        • Personal_Project 01 - commu.. (1)
        • TeamProject - JOINUS (4)
      • EUNB (30)
        • 맛집 (27)
        • 여행 (3)
        • 전세사기 (0)
      • 오블완챌린지 ++ (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 짱민지
    • 아랄이
  • 공지사항

  • 인기 글

  • 태그

    인제 두부
    배열 한 컬럼에 넣기
    전포 밥집
    전포동 카페
    속초 중앙시장 감자전
    인제 고향집
    oracle
    콩콩팥팥 두부
    속초 숙소 내돈내산
    전포 오꼬노미야끼
    Database
    전포 맛집
    전포동 핫플
    전포 데이트
    센텀 신세계백화점 팝업
    티스토리챌린지
    alter
    콩콩팥팥 맛집
    전포 신상 맛집
    서면 맛집
    전포 연어덮밥
    속초 해변 숙소
    망미 테린느
    서면 설야멱
    오블완
    전포동 맛집
    망미 조용한 카페
    mysql
    망미 바
    망미 카페
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.0
3unB
디지털원패스
상단으로

티스토리툴바