들어가며
본인확인 기능을 개발하기 위해 팀에서는 나이스 본인확인 서비스를 도입했습니다. 나이스에서 제공하는 개발 가이드를 보면서 도입을 해야 했는데, 배경 지식이 전혀 없는 상황에서 도입을 하려고 하니 여러 삽질을 거쳐야만 했습니다. 나이스 인증을 도입하는 다른 분들이 저와 같은 어려움을 겪지 않았으면 하는 바람으로, 나이스 인증 기능을 어떻게 도입했는지를 상세하게 작성해 보려 이 글을 적습니다.
나이스 본인확인
기관 토큰을 발급받는 과정을 저번 글에서 살펴봤습니다. 다음은 유저가 나이스 본인인증 요청 버튼을 클릭하면 NICE 표준창을 호출할 수 있도록 로직을 구현해 보겠습니다. 3번부터 7번까지의 과정을 살펴보겠습니다. 이 과정을 코드를 보면서 따라가고 싶으신 분들은 코드를 레포지토리에 올려두었으니 함께 확인해 주시면 됩니다.
나이스 본인인증 요청
클라이언트에서 NICE 표준창을 호출하려면, 아래 폼을 입력해서 NICE 표준창을 띄웁니다.
<form name="form" id="form">
<input type="hidden" id="m" name="m" value="service" />
<input
type="hidden"
id="token_version_id"
name="token_version_id"
value=""
/>
<input type="hidden" id="enc_data" name="enc_data" value="" />
<input
type="hidden"
id="integrity_value"
name="integrity_value"
value=""
/>
</form>
호출창을 표시하려면 서버에서 token_version_id, enc_data, integrity_value 데이터를 전달받아야 합니다.
만약 유저가 본인인증 버튼을 클릭하면 클라이언트는 token_version_id, enc_data, integrity_value 데이터를 전달할 수 있도록 백엔드에서 구현한 암호화 토큰 요청 API를 호출해야 합니다. 그럼 암호화 토큰 요청 API를 어떻게 구성해야 하는지 알아보겠습니다.
공식 문서에 따르면, 암호화 토큰 요청 API를 호출할 때 요청 값으로 req_dtim, req_no, enc_mode 등의 값을 body 값으로 전달해야 합니다. 그리고 헤더 값으로 기관 토큰 요청에서 전달받은 access Token을 전달하고, clientId와 productId 값을 전달해야 합니다. 아래에서 암호화 토큰 요청 API를 어떻게 호출하는지 자세히 살펴보겠습니다.
1. 암호화 토큰 요청
먼저 NICE에 암호화 토큰 요청을 하기 위해 로직을 구성합니다. Service 클래스에서 getNiceCryptoToken 메서드에 로직을 구성했습니다.
reqDtim을 구성하기 위한 로직을 구성하고, uuid4를 활용해서 reqNo를 구성합니다. 그 후 NICE 암호화 토큰 요청 API를 호출하는 로직을 아래처럼 구현합니다.
위와 같이 API 호출 로직을 구성했습니다.
여기서 productId는 상품 코드 값입니다.
여기까지 로직을 구성해서 API를 호출하면 NICE로부터 위와 같은 정보를 받습니다. 여기까지 완료되면 다음은 대칭키를 생성해 줍니다.
2. 대칭키 생성 및 세션 저장
암호화 Token 요청 API 요청일시와 요청시간, 응답받은 토큰 값의 조합으로 요청 데이터를 암호화할 대칭키와 무결성키를 생성해 줍니다. 이를 위해 먼저 대칭키 생성 로직을 구성하겠습니다.
대칭키는 나이스로부터 반환될 인증 결과를 복호화하는데 다시 사용되기 때문에 세션에 저장해 줍니다.
3. 요청 데이터 암호화
나이스 본인인증 화면을 호출하기 위한 요청 값을 위에서 생성한 대칭키로 암호화해 줍니다. returnurl와 methodtype 경우 나이스 본인인증 처리 결과를 리다이렉트 받을 url과 http method로 해당 값으로 인증 결과를 처리할 API 생성이 필요합니다.
4. Hmac 무결성 체크 값 생성
나이스 본인인증 화면을 호출하기 위한 요청 값으로 무결성 체크값 또한 생성해 줍니다.
암호화 토큰 요청 API에서 반환받은 토큰 버전 아이디, 암호화한 요청 데이터, 무결성 값을 클라이언트에 반환합니다.
여기까지 입력하면, token_version_id, enc_data, integrity_value 값을 클라이언트에게 전달할 수 있습니다. 클라이언트는 백엔드로부터 받은 값을 활용해서 표준창을 띄웁니다.
나이스 표준창 호출
서버에서 받은 요청 정보를 활용해서 NICE 표준창을 호출하는 로직을 구현해 보겠습니다. 임시로 Vue를 활용해서 로직을 구현했습니다.
백엔드로부터 받은 요청 정보를 활용해서 token_version_id, enc_data, integrity_value 값을 구성합니다. 그 후 이 값을 NICE에게 전달하는데, 여기서 returnUrl 정보를 query parameter로 전달합니다.
returnUrl은 유저가 인증에 성공했을 경우, 유저의 암호화된 정보를 전달하는 url입니다. 저는 백엔드의 callback 경로로 전달받기를 희망하여 returnUrl을 localhost:3000/callback으로 구성했습니다. 여기까지 완료되면 8번까지 완료됐습니다.
마치며
다음 글에서는 NICE에서 받은 암호화된 유저 정보를 복호화하여 유저 정보를 조회하는 로직을 함께 살펴보겠습니다.
출처
'Project > 서버 개발' 카테고리의 다른 글
[Project] 프로젝트 삽질기66 (feat DOO, Enum 클래스) (0) | 2024.07.11 |
---|---|
[Project] 프로젝트 삽질기65 (feat 나이스 인증 3) (0) | 2024.06.24 |
[Project] 프로젝트 삽질기63 (feat 나이스 인증 1) (0) | 2024.06.24 |
[Project] 프로젝트 삽질기62 (feat sentry 잘 활용하기) (0) | 2024.05.19 |
[Project] 프로젝트 삽질기61 (feat IAM MFA 강제) (0) | 2024.05.16 |