Steamworks 문서
사용자 인증 및 소유권

개요

Steamworks는 Steam 사용자의 신원을 인증하고 애플리케이션 소유권을 확인하기 위한 여러 가지 수단을 제공합니다. 아래 문서는 다음과 같은 시나리오에서 사용되는 인증 수단에 대해 설명합니다.

Steam 내부의 사용자 식별

모든 Steam 사용자는 Steam ID에 해당하는 64비트 숫자 ID로 식별할 수 있습니다. Steamworks C++ API에서 사용자의 SteamID는 CSteamID 객체 안에 있습니다. ISteamUser::GetSteamID를 호출하여 현재 사용자의 SteamID를 가져올 수 있으며, 반환된 값에 CSteamID.ConvertToUint64()를 호출하면 64비트 ID를 가져올 수 있습니다.

다음 인증 수단을 사용하면 사용자의 SteamID를 안전하게 확인할 수 있습니다.

이 문서에서 다루는 API

세션 티켓

세션 티켓은 사용자의 게임 클라이언트와 다른 게임 클라이언트(P2P 멀티플레이어 세션 등) 또는 리슨/전용 게임 서버(ISteamGameServer API 사용) 사이에서 사용자의 신원을 확인하는 데 사용되는 서명된 티켓입니다. 이 티켓은 현재 게임과 관련하여 다운로드 가능한 콘텐츠의 소유권을 확인하고, 사용자가 VAC로 차단되었는지(VAC(Valve Anti-Cheat) 및 게임 차단 참조) 확인하는 데도 사용됩니다.
세션 티켓은 Steamworks 웹 API를 통해 게임 클라이언트와 보안 백엔드 서버 사이에서 사용자의 신원을 확인하는 데도 사용됩니다. 보안 서버는 partner.steam-api.com에 HTTPS 요청을 보낼 수 있어야 합니다.

암호화된 애플리케이션 티켓

암호화된 애플리케이션 티켓을 통해 게임 클라이언트와 안전한 백엔드 서버 사이에서 사용자의 신원을 확인할 수 있습니다. 세션 티켓과 달리, 암호화된 애플리케이션 티켓을 확인할 때는 보안 서버가 HTTPS 요청을 보내지 않아도 됩니다. 그 대신 보안 서버가 C++ 라이브러리와 전용 대칭 키를 사용해 티켓을 확인합니다. 이 라이브러리는 Steamworks SDK의 public/steam/lib 디렉터리에 Windows용과 Lunux용, 32비트와 64비트 버전으로 포함되어 있습니다.

암호화된 애플리케이션 티켓을 사용하기 전에 각 타이틀을 위한 개인 키를 생성해야 합니다. 귀하의 애플리케이션에서 Steamworks 설정 편집으로 이동한 후, ‘보안’ 드롭다운에서 ‘SDK 인증’을 선택합니다. 이 키는 타이틀의 AppID, 다운로드 가능한 해당 타이틀의 모든 콘텐츠와 연결됩니다. Steamworks에서 해당 섹션에 접근하려면 관련 애플리케이션에 대한 "관리 서명" 권한이 있어야 합니다.
주의: 이 키는 안전하게 보관해야 하며, 게임 애플리케이션과 함께 배포해서는 안 됩니다.

Steamworks 웹 API

Steam은 다양한 Steamworks 기능에 액세스하는 데 사용되는 HTTP 기반의 웹 API를 제공합니다. API는 게임 클라이언트 또는 서버와 같이 HTTP 요청이 가능한 모든 애플리케이션에서 액세스할 수 있는 공용 메서드를 담고 있습니다. API는 또한 인증이 필요한 보호된 메서드를 포함하며, 신뢰할 수 있는 백엔드 애플리케이션에 액세스할 수 있도록 고안되었습니다. 웹 API에 대한 더욱 자세한 내용은 여기에서 확인할 수 있습니다.

P2P 또는 게임 서버

세션 티켓

사용자 인증

다음은 세션 티켓을 사용해 사용자의 게임 클라이언트(클라이언트 A)와 다른 클라이언트 또는 게임 서버(클라이언트 B) 사이에서 사용자의 신원을 확인하는 과정입니다.

세션 티켓에 관한 몇 가지 중요한 정보:
  • 세션 티켓은 한 번만 사용할 수 있습니다. 멀티플레이어 세션에서는 티켓을 요청하는 모든 클라이언트가 ISteamUser::GetAuthSessionTicket을 호출해야 합니다.
  • P2P 멀티플레이어 세션에서 플레이어를 인증할 때는, 각 게임 클라이언트가 멀티플레이어 세션 안에 있는 다른 모든 게임 클라이언트의 신원을 확인해야 합니다.
  • 세션 티켓 사용을 마치면, ISteamUser::CancelAuthTicketISteamUser::GetAuthSessionTicket이 반환한 모든 핸들에 대해 호출해야 합니다.
  • 클라이언트 A가 ISteamUser::CancelAuthTicket을 호출하면, 클라이언트 B는 클라이언트 A의 티켓이 이제 유효하지 않다는 ISteamUser::ValidateAuthTicketResponse_t 콜백을 받습니다.
  • 클라이언트 A가 게임에서 나갈 때, 클라이언트 A의 ISteamUser::CancelAuthTicket 호출이 클라이언트 B가 ISteamUser::EndAuthSession을 호출하기 전에 처리되면, 클라이언트 B는 티켓이 취소되었다는 ISteamUser::ValidateAuthTicketResponse_t 콜백을 받을 수도 있습니다. 클라이언트 A가 나간다는 상호 합의가 있으므로 이 콜백은 무시할 수 있습니다.
  • 네트워크 상태에 따라 Steam 백엔드에서 ISteamUser::BeginAuthSession의 호출자에게 불특정 시간 동안 콜백을 제공하지 못할 수도 있습니다. ISteamUser::BeginAuthSession의 호출자(클라이언트 B)는 이 콜백을 받기 전까지 클라이언트 A의 신원을 모르는 것으로 간주해야 하지만, 멀티플레이어 세션은 계속 유지해야 합니다.
  • 만일 ISteamUser::BeginAuthSession의 호출자가 클라이언트 A의 티켓이 유효하지 않다는 ISteamUser::ValidateAuthTicketResponse_t 콜백을 받으면, 호출자는 클라이언트 A와의 멀티플레이어 세션 유지를 거부해야 합니다. 이때 게임 내 다른 피어들도 클라이언트 A와의 게임 플레이하기를 거부하지 않으면, 호출자가 멀티플레이어 세션에서 나가야 합니다.
  • ISteamGameServer는 동일한 세션 티켓 메서드를 사용하여 게임 클라이언트와 게임 서버 사이의 인증을 처리합니다.

소유권 확인

세션 티켓을 사용할 때 Steam은 자동으로 현재 AppID의 소유권을 확인합니다. 사용자가 현재 AppID를 소유하지 않은 경우에는, ISteamUser::ValidateAuthTicketResponse_tm_eAuthSessionResponse필드가 k_EAuthSessionResponseNoLicenseOrExpired로 설정됩니다. 사용자의 세션 티켓을 받아 ISteamUser::BeginAuthSession에 전달한 후, ISteamUser::UserHasLicenseForApp 메서드를 사용하여 사용자가 특정 다운로드 콘텐츠를 소유하고 있는지 확인할 수 있습니다.

백엔드 서버

세션 티켓과 Steamworks 웹 API

사용자 인증

다음은 세션 티켓을 사용해 사용자의 게임 클라이언트와 보안 서버 사이에서 사용자의 신원을 확인하는 과정입니다.
  • 클라이언트는 ISteamUser::GetAuthTicketForWebApi를 호출하여 세션 티켓을 가져와야 합니다.
  • 티켓의 유효성을 보증하려면 클라이언트는 반드시 ISteamUser::GetTicketForWebApiResponse_t 콜백을 기다려야 합니다.
  • 클라이언트는 세션 티켓을 보안 서버에 보내야 합니다.
  • 보안 서버는 partner.steam-api.com에 HTTPS 요청을 보내 ISteamUserAuth/AuthenticateUserTicket 웹 메서드를 호출하고, 사용자의 세션 티켓을 16진수로 인코딩된 UTF-8 문자열로 전달해야 합니다. 이 방법을 사용하면 제공된 티켓의 AppID와 관련된 Steam 웹 API 키 또는 웹 API 게시자 키를 전달할 수 있습니다. 이 API의 향후 업데이트에서는 웹 API 게시자 키가 제공되면 호출자에게 더 많은 정보를 반환할 수 있습니다.
  • 사용자의 티켓이 유효하면 ISteamUserAuth/AuthenticateUserTicket이 사용자의 64비트 SteamID를 반환합니다.

소유권 확인

사용자의 신원이 확인되면 보안 서버는 ISteamUser/CheckAppOwnership 웹 API 메서드를 사용하여 사용자가 특정 AppID를 소유하고 있는지 확인하거나, ISteamUser/GetPublisherAppOwnership을 호출하여 해당 게시자 키와 연관된, 사용자가 소유한 모든 AppID의 목록을 받습니다.

암호화된 애플리케이션 티켓

사용자 인증

다음은 암호화된 애플리케이션 티켓을 사용해 사용자의 게임 클라이언트와 보안 서버 사이에서 사용자의 신원을 확인하는 과정입니다.

구현 예시는 SDK의 Steamworks API Example Application (SpaceWar) 프로젝트에서 확인할 수 있습니다. 특히 CSpaceWarClient::RetrieveEncryptedAppTicketCSpaceWarClient::OnRequestEncryptedAppTicket을 확인하면 됩니다.

소유권 확인

Steam은 티켓 발급 목적에 맞는 앱ID를 소유한 사용자에게만 암호화된 애플리케이션 티켓을 발급합니다. 보안 서버는 암호화된 애플리케이션 티켓을 복호화한 후,SteamEncryptedAppTicket::BIsTicketForApp 메서드를 사용해 해당 티켓의 AppID가 타이틀의 AppID와 일치하는지 확인합니다. 서버는 SteamEncryptedAppTicket::BUserOwnsAppInTicket 메서드를 사용해 사용자가 특정 다운로드 가능한 콘텐츠(DLC)를 소유하고 있는지 확인할 수도 있습니다.

OpenID를 통한 웹 브라우저 기반 인증

Steam은 Open ID 2.0 사양서에 명시된 바와 같이 OpenID 제공자입니다. 웹 브라우저에서 타사 웹사이트는 OpenID를 사용해 사용자의 SteamID를 확인할 수 있으며, SteamID는 타사 웹사이트에 로그인하거나 해당 웹사이트의 기존 계정과 연결하는 데 사용할 수 있습니다.

OpenID 이용 시 사용자는 웹 브라우저로 타사 웹사이트에 접속한 상태로 시작합니다. 사용자가 OpenID로 해당 웹사이트에 로그인하거나 계정과 연결하고자 하면, 해당 사이트는 사용자를 Steam 커뮤니티 웹사이트의 로그인 양식으로 이동시킵니다. 사용자가 Steam 로그인 정보를 입력하면 사용자의 웹 브라우저는 타사 웹사이트로 되돌아가며, URL에는 몇 가지 OpenID 전용 데이터가 추가됩니다. 그러면 사이트의 OpenID 라이브러리는 이 데이터로 사용자의 SteamID를 확인하고 SteamID를 가져옵니다.

Steam은 다음과 같이 타사 웹사이트에서 Steam 로그인 페이지로 연결될 때 사용 가능한 이미지를 제공합니다.
sits_large_border.png

sits_large_noborder.png

sits_small.png

사용자 인증

Steam의 OpenID 2.0 기능은 사용자의 Steam 계정을 타사 웹사이트와 연결하는 데 사용할 수 있습니다.
OpenID 라이브러리의 목록은 OpenID 웹사이트에서 확인할 수 있습니다. OpenID로 사용자의 식원을 확인하는 방법은 다음과 같습니다.
  • https://steamcommunity.com/openid/를 Steam의 OP 엔드포인트 URL로 사용하도록 OpenID 라이브러리를 구성합니다.
  • 사용자 인증을 거치면 사용자의 잠정 ID에 사용자의 SteamID가 포함됩니다. Steam 잠정 ID의 형식은 다음과 같습니다. http://steamcommunity.com/openid/id/<steamid>.

소유권 확인

사용자의 신원이 확인되면 보안 서버는 ISteamUser/CheckAppOwnership 웹 API 메서드를 사용하여 사용자가 특정 AppID를 소유하고 있는지 확인하거나, ISteamUser/GetPublisherAppOwnership을 호출하여 해당 Web API 게시자 키와 연관된, 사용자가 소유한 모든 AppID의 목록을 받습니다.

예시

타사 계정과 Steam 계정 연동

사용자의 SteamID를 타사 계정과 연결하면 타사 계정과 Steam 계정을 연동할 수 있습니다.

사용자의 SteamID는 게임 내에서 또는 웹 브라우저를 통해 안전하게 가져올 수 있으며, 최초 연결이 완료된 후에는 사용자의 SteamID를 확인하는 것만으로 타사 계정에 대한 안전한 액세스를 허용할 수 있습니다. 이 방법을 사용하면, Steam 사용자가 타사 계정 시스템에 2차로 로그인할 필요가 없게 됩니다. 또한 새로운 SteamID가 만들어질 때 새로운 제3자 계정이 자동으로 생성되어 연결되도록 하면, Steam 사용자는 2차 인증이 이루어진다는 사실을 전혀 알 필요가 없을 것입니다. 하나의 Steam 계정으로 모든 게임을 이용할 수 있으므로 사용자의 경험이 개선되고, 새로운 게임의 설치 및 플레이에 대한 진입 장벽이 해소됩니다.

게임 내에서 연결

세션 티켓은 Steamworks 웹 API를 통해 게임 클라이언트와 안전한 백엔드 서버 사이에서 사용자의 신원을 확인하는 데도 사용됩니다.

웹 브라우저에서 연결

Steam은 OpenID 2.0 사양을 지원하므로, 사용자는 귀하의 웹사이트에서 안전하게 Steam 계정에 로그인하고 SteamID를 가져올 수 있습니다. Steam과 함께 OpenID를 사용하는 방법은 OpenID 사용에서 확인하십시오.

소유권 확인

사용자의 신원이 확인되면 보안 서버는 ISteamUser/CheckAppOwnership 웹 API 메서드를 사용하여 사용자가 특정 AppID를 소유하고 있는지 확인하거나, ISteamUser/GetPublisherAppOwnership을 호출하여 해당 Web API 게시자 키와 연관된, 사용자가 소유한 모든 AppID의 목록을 받습니다.

타사 CD 키에서 기본 Steam 소유권 확인으로 마이그레이션하기

Steam은 타이틀에서 사용자를 인증할 수 있는 몇 가지의 방법을 제공하기 때문에 제3자 CD 키를 이용할 필요가 없습니다. 당사는 CD 키의 일반적인 사용 사례와 각 사례를 Steam으로 구현하는 방법을 다음과 같이 목록으로 구성했습니다.

비공개 포럼 접속

사용자가 OpenID로 Steam 계정에 바로 로그인하도록 합니다. OpenID는 사용자의 64비트 SteamID를 반환하며 ISteamUser/CheckAppOwnership과 함께 사용하여 사용자가 귀하의 appid를 소유했는지 확인할 수 있습니다. 자세한 내용은 상단의 제3자 계정을 Steam 계정에 연결에서 확인하시기 바랍니다.

Steam 외부 게임의 'DRM-free' 빌드 잠금 해제하기

OpenID와 ISteamUser/CheckAppOwnership(상단의 문서)으로 귀하의 사이트에 있는 콘텐츠를 잠금 해제합니다. 또는 DRM-free 빌드를 선택적 무료 DLC로 업로드할 수 있습니다.

소프트웨어가 자신의 웹사이트에서 판매되고 키를 사용하여 액세스하는 경우

사용자가 OpenID로 Steam 계정에 바로 로그인하도록 합니다. OpenID는 사용자의 64비트 SteamID를 반환하며 ISteamUser/CheckAppOwnership과 함께 사용하여 사용자가 귀하의 appid를 소유했는지 확인할 수 있습니다. 자세한 내용은 상단의 타사 계정과 Steam 계정 연동에서 확인할 수 있습니다.

타사 키 등록을 위하여 인-게임 아이템을 드롭하는 경우

Steam 보관함 서비스를 사용 중이라면 아이템의 itemdef가 홍보 아이템으로 구성됐는지 확인하고 클라이언트에서 ISteamInventory::AddPromoItem을 호출하세요.
자체 아이템 백엔드가 있는 경우, 게임 클라이언트에서 ISteamUser::GetAuthSessionTicket을 호출한 뒤 소유권 확인을 위해 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership을 사용합니다. 추가 정보

키가 잠금 해제된 소프트웨어의 버전을 제어하는 경우

게임의 각 버전에는 고유한 AppID가 있어야 합니다. 게임 클라이언트에서 소유권을 확인하려면 ISteamUser::GetAuthSessionTicket을 호출한 뒤 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership을 사용합니다. 추가 정보