토스인증은 OAuth 2.0기반 accessToken (Client Credentials Grant Type)인증방식을 사용합니다. 산업프로토콜로서 RFC6749에 정의된 방식입니다.
토스인증은 사용자가 토스 앱을 통해 진행한 전자서명(Signature) 값을 PKCS#7 규격의 공개키 암호화 표준 방식에 따라 제공합니다.
토스인증 API의 EndPoint에 대한 모든 요청은 HTTPS 프로토콜을 따라야 합니다. TLS(Transport Layer Security, 전송 계층 보안) 1.2 미만의 SSL/TLS 버전은 보안이 취약하기 때문에 TLS 버전 1.2 이상만 지원합니다.
인증의 요청과 응답을 AES 암복호화 할 때 사용되는 세션 키로 RSA/ECB/OAEPWithSHA-1AndMGF1Padding 알고리즘을 사용합니다.
토스인증 서비스에 따라 호스트 정보가 구분되어 있습니다. 연동 용도에 맞게 활용해주세요.
// AccessToken 발급
https://oauth2.cert.toss.im
// 인증요청, 상태조회, 결과조회
https://cert.toss.im
https://mydata.cert.toss.im
요청 서버의 아웃바운드에 아래 토스인증의 IP를 허용해주세요. 포트는 모두 443
입니다.
반대로 토스 인바운드는 제한없이 오픈 되어 있어서 바로 통신 테스트가 가능해요.
VPN
또는 전용선
통신이 필요한 경우 사전에 토스로 문의주세요.
117.52.3.222
117.52.3.235
211.115.96.222
211.115.96.235
117.52.3.221
211.115.96.221
토스인증 API에는 인증 요청 과정에서 고객의 개인정보를 포함하는 경우가 있습니다. 개인정보 보호를 위해 고객사 서버와 토스 서버는 암호화된 데이터를 주고 받고 고객사에서는 복호화 후 평문 데이터를 확인할 수 있습니다.
- 인증 요청에서 고객의 이름, 생년월일, 휴대폰번호를 전달할 때 암호화
- 전자서명 서비스 원문에 고객의 개인정보가 포함되는 경우 원문 암호화
- 인증 결과로 토스 서버에서 CI・DI 등을 포함한 개인정보를 제공하는 경우 암호화
표준창 호출 방식에서는 고객사 서버에서 토스인증 서버로 고객의 정보를 전달하지 않기 때문에 암호화 과정이 불필요합니다.
다만, 사용자 인증이 완료된 이후 결과조회 API를 호출할 때는 세션키를 포함해서 요청해야 합니다.
https://github.com/toss/toss-cert-java-sdk
package im.toss.cert.sdk;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
class TossCertSessionTest {
@Test
public void test() {
// 1. 세션 생성기를 사전에 1회만 생성해 주세요.
TossCertSessionGenerator tossCertSessionGenerator = new TossCertSessionGenerator();
// 2. 개인정보가 포함되어 있는 인증요청 API 호출 전에 세션을 생성해 주세요.
TossCertSession tossCertSession = tossCertSessionGenerator.generate();
// 3. 개인정보를 암호화 해주세요.
String userName = "김토스";
String encryptedUserName = tossCertSession.encrypt(userName);
System.out.println("encryptedUserName: " + encryptedUserName);
// 4. 인증요청 API를 호출해 주세요.
// 인증요청 API의 바디 파라미터에 생성된 sessionKey를 추가해 주세요.
String sessionKey = tossCertSession.getSessionKey();
String userName = encryptedUserName;
// 5. 사용자의 인증이 끝나면 결과조회 API 호출 전에 새로운 세션을 생성해 주세요.
TossCertSession tossCertSession = tossCertSessionGenerator.generate();
// 6. 결과조회 API를 호출해주세요.
// 결과조회 API의 바디 파라미터에 생성된 sessionKey를 추가해 주세요.
String sessionKey = tossCertSession.getSessionKey();
String txId = "a39c84d9-458d-47e4-acf7-c481e851f79b";
// 7. 복호화를 위해 결과조회 요청에서 생성했던 tossCertSession를 가지고 있어야 합니다.
// response.userName 을 응답받은 암호화된 userName 이라고 가정합니다.
// decryptedUserName 은 무결성 검증까지 완료되어 있습니다.
String decryptedUserName = tossCertSession.decrypt(response.userName);
}
}
https://github.com/toss/toss-cert-examples