메인 콘텐츠로 건너뛰기

개요

OneSignal은 사용자 사칭을 방지하는 데 도움이 되는 신원 확인이라는 향상된 보안 기능을 제공합니다. 이 기능은 서버에서 안전하게 생성되는 JSON Web Token(또는 JWT)을 사용합니다. 구독 정보를 확인하기 위해 이러한 토큰이 앱과 OneSignal의 API로 전달됩니다. 신원 확인을 활성화하여 보호할 항목:
  • 사용자 로그인
  • 이메일 구독 추가
  • SMS 구독 추가
  • 사용자 신원 수정
신원 확인은 현재 베타 버전입니다. 계정에서 활성화하려면 support@onesignal.com에 문의하세요. 지원팀이 활성화하면 대시보드에서 활성화할 수 있습니다(5단계 참조).

전제 조건

래퍼 SDK 지원(Flutter, React Native, Unity 등)은 곧 제공될 예정입니다.

설정

1

새 키 생성

OneSignal 계정에 로그인하고 설정 > 키 및 ID > 신원 확인으로 이동합니다.
Settings page showing Keys and IDs with Identity Verification section
새 키 생성을 클릭하여 새 키 쌍을 생성합니다.
Generate New Keys button in the Identity Verification section
PEM 파일을 다운로드하거나 개인 키를 복사하고 개인 키를 안전하게 저장해야 합니다.
Identity Verification key pair with private key and PEM download
항상 키 관리 시스템과 같은 안전한 환경에 개인 키를 저장하세요. 클라이언트 측 코드, 공개 저장소 또는 로그에 개인 키를 절대 노출하지 마세요.
2

백엔드에서 확인 JWT 생성

신원 확인을 위해서는 OneSignal에 로그인하기 전에 인증 서버로 최종 사용자를 인증해야 합니다. 최종 사용자가 백엔드로 인증하면 토큰을 생성하고 기기로의 인증 응답에 포함시킵니다. 앱이 백엔드 서버를 실행하지 않는 경우 사용자를 확인하고 이러한 토큰을 생성하기 위한 경량 서버 설정을 고려하세요.

JWT 페이로드

JWT는 다음 속성을 가질 수 있습니다:
iss
필수
OneSignal 앱 ID
exp
필수
토큰 만료 날짜.
identity
필수
사용자의 별칭.
subscriptions
사용자에게 이메일 및 SMS 구독을 추가할 때만 필요합니다.

JWT 서명

ES256 알고리즘을 사용하여 JWT에 서명합니다. JWT를 OneSignal로 전송할 때 확인 문제를 방지하려면 백엔드가 이 서명 방법을 사용하도록 구성되어 있는지 확인하세요. 이를 위해 JWT 라이브러리를 사용하는 것이 좋습니다.jsonwebtoken을 사용하는 예제:
import jwt from 'jsonwebtoken';

const APP_ID = process.env['ONESIGNAL_APP_ID']
const IDENTITY_VERIFICATION_SECRET = process.env['ONESIGNAL_IDENTITY_VERIFICATION_SECRET_KEY']

// Generates JWT, potentially with subscription claims, for the user identified by the External ID
function signOneSignalJWT(externalId, subscriptions) {
return jwt.sign({
iss: APP_ID,
exp: Math.floor(Date.now() / 1000) + 3600, // 1-hour expiration
identity: {
'external_id': externalId,
},
subscriptions
},
IDENTITY_VERIFICATION_SECRET,
{ algorithm: 'ES256' });
}

// Pass this token to your mobile app to use with the `login` SDK method
const onesignalJWT = signOneSignalJWT('EXTERNAL_ID');

개인 키는 대시보드에서 다운로드한 이전 단계의 파일에 있습니다.

JWT 확인

SDK와 통합하기 전에 서버를 시작하고 엔드포인트를 호출하여 JWT가 올바르게 생성되고 있는지 확인하세요:
  node server.js
  curl http://localhost:3000/generate-jwt/your-external-id
다음과 같은 응답을 받아야 합니다:
{
  "jwt": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9..."
}
jwt.io에 JWT 값을 붙여넣고 디코딩된 페이로드에 다음 매개변수가 포함되어 있는지 확인하세요:
{
  "iss": "your-onesignal-app-id",
  "exp": 1234567890,
  "identity": {
    "external_id": "your-external-id"
  }
}
다음 단계로 넘어가기 전에 다음 사항을 확인하세요:
  • iss설정 > 키 및 ID의 OneSignal 앱 ID와 일치하는지
  • identity.external_id가 있고 OneSignal.login()에 전달할 값과 일치하는지
  • exp가 미래의 타임스탬프인지 — 만료된 토큰은 OneSignal에 의해 거부됩니다

구독 포함

이상적으로는 사용자 로그인 시 이메일 또는 전화번호와 같은 구독 세부 정보가 JWT 페이로드에 포함됩니다. 이러한 세부 정보를 미리 사용할 수 없는 경우 확인 서버는 구독 정보를 사용할 수 있게 되면 토큰을 동적으로 생성하는 엔드포인트를 제공해야 합니다.예제: 구독을 추가하기 위한 JWT 생성
const subscriptions = [
  {
      "type": "Email",
      "token": "[email protected]"
  },
  {
      "type": "SMS",
      "token": "+12345678"
  }
]
const onesignalJWT = signOneSignalJWT('EXTERNAL_ID', subscriptions)
3

`login` 메서드에 JWT 전달

백엔드가 JWT를 생성한 후 이를 사용하여 login 메서드를 호출합니다. 이 토큰은 이메일 또는 SMS 구독 추가와 같은 변경 사항이 적용되기 전에 사용자의 신원이 확인되도록 합니다.로그인 예제:
String externalId = "YOUR_EXTERNAL_ID";
String onesignalJWT = "YOUR_JWT_TOKEN";

OneSignal.login(externalId, onesignalJWT);
4

JWT 수명 주기 이벤트 처리

토큰 무효화와 같은 시나리오를 처리하기 위해 백엔드에 전용 엔드포인트를 구현해야 합니다. 이 엔드포인트는 OneSignal이 업데이트를 요청할 때 새로고침된 JWT를 제공해야 합니다.토큰 무효화 처리 및 JWT 새로고침 예제:
OneSignal.addUserJwtInvalidatedListener(event -> {
  // Get the expired user's External ID
  String externalId = event.getExternalId();

  // Fetch a new JWT from your backend for the user
  String onesignalJWT = "yourUpdatedToken";

  // Provide the new JWT to the SDK
  OneSignal.updateUserJwt(externalId, onesignalJWT);
});
이를 통해 사용자의 JWT가 무효화되면 백엔드에서 새 JWT를 가져와 OneSignal로 전달할 수 있습니다. 인증 중에 생성된 토큰에 이메일 및 전화번호가 포함되지 않은 경우 이 기능을 사용하여 이메일 및 SMS 구독을 관리할 수 있도록 이메일 및 전화번호가 포함된 토큰을 생성할 수도 있습니다.
5

대시보드에서 토큰 신원 확인 활성화

설정 > 키 및 ID에서 토큰 신원 확인을 토글하여 활성화합니다.
Token Identity Verification toggle enabled in dashboard settings
활성화되면 앱은 구독 진위 여부를 확인하기 위해 OneSignal JWT를 전송해야 합니다. 또한 앱은 신원 확인 토큰 서버에서 생성된 JWT를 사용하여 login 메서드를 호출해야 합니다.

구독 추가

모바일 앱에서 구독을 추가하기 위해 추가 단계를 수행할 필요가 없습니다. 로그인 메서드를 호출하면 자동으로 처리됩니다.
OneSignal.getUser().addEmail(emailAddress);

REST API

토큰 신원 확인이 활성화되면 다음 API에 대한 모든 요청은 헤더에 서버에서 생성된 JWT를 베어러 토큰으로 포함해야 합니다. 예: Authorization: Bearer <JWT>.

FAQ

신원 확인이 필수인가요?

아니요, 하지만 강력히 권장됩니다. 이 기능이 없으면 사용자의 외부 사용자 ID를 아는 모든 클라이언트가 해당 사용자를 사칭하고 구독이나 데이터를 수정할 수 있습니다.

세션 중에 JWT가 만료되면 어떻게 되나요?

SDK가 JWT 무효화 이벤트를 발생시킵니다. addUserJwtInvalidatedListener를 구현하여(JWT 수명 주기 이벤트 처리 참조) 백엔드에서 업데이트된 토큰을 가져와 updateUserJwt에 전달하세요.

어떤 SDK가 신원 확인을 지원하나요?

현재 네이티브 Android SDK(5.2.0+)와 iOS SDK(5.3.0+)입니다. 래퍼 SDK 지원(Flutter, React Native, Unity 등)은 곧 제공될 예정입니다.

REST API에 신원 확인이 필요한가요?

토큰 신원 확인이 활성화되면 지원되는 API에 대한 모든 요청은 Authorization 헤더에 서버에서 생성된 JWT를 베어러 토큰으로 포함해야 합니다. JWT는 SDK 사용과 동일한 방식으로 생성됩니다.

JWT는 어떤 알고리즘을 사용하나요?

신원 확인에는 ES256 알고리즘(P-256 및 SHA-256을 사용하는 ECDSA)으로 서명된 JWT가 필요합니다. 다른 알고리즘은 거부됩니다.