반응형
- 디지털원패스 : 하나의 아이디로 본인이 선택한 인증 수단을 사용하여 안전하고 편리하게 여러 전자 정부 서비스(정부24, 고용노동부, 교육부 등)를 이용할 수 있는 인증 서비스
- 사용방법
- 디지털원패스에 가입 후 전자 정부 서비스에서 디지털원패스 사용 가능
- 디지털원패스에 사용자가 제공하는 정보 : 이름, 이메일, 휴대폰번호, 생년월일
- 인증방법
- 모바일 인증(지문, 안면, 패턴, PIN, 공동인증서)
- 공동인증서(PC)
- 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가 다름
한 사람이 여러 개의 계정을 만드는 것을 방지하고자 만들어짐
- 주의사항
- 디지털원패스 연계는 신규 회원가입이 아니기 때문에 로그인 연결에 대한 동의절차의 추가정보 입력화면에서 별도의 비밀번호를 입력받으면 안됨 (미준수 시 연계 오픈이 제한될 수도 있음)
- 디지털원패스에서 제공하는 이름, 생년월일, 전화번호 같은 사용자 정보를 입력(수정) 금지
- 필수 정보 중 디지털원패스에서 제공하지 않는 정보만 수집(선택 정보 제외)
- 선택정보는 나의 정보화면 혹은 필요한 시점에서 입력받기를 권장
- 적용사례
- 회원(아이디) 로그인
- KTV국민방송 http://www.ktv.go.kr/ (아이디, 공인인증서)
- 1365자원봉사 포털 https://www.1365.go.kr/(간편인증, SNS, 아이디)
- 비회원(본인확인) 로그인
- 대한법률구조공단 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 | 사용자의 휴대전화번호 |
사용자의 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' 카테고리의 다른 글
[오블완챌린지]일기 (1) | 2024.11.14 |
---|---|
TCP/IP 정리 (0) | 2024.05.22 |
슬랙 권한 정리 (0) | 2023.01.31 |
SNS 소셜 로그인(카카오로그인) (0) | 2023.01.05 |