세션 관리 #

사용자 계정 및 세션 관리와 결합된 인증은 복잡해 보일 수 있습니다. 다음과 같이 함께 제공되는 많은 작동하는 부분이 있습니다:

  • 플레이어 행동
  • 플레이어 장치
  • 소셜 공급자 계정
  • Nakama 사용자 계정

바로 코딩을 시작하고 관련 없는 개념 모음을 하나로 연결하고 싶은 생각이 들 수 있습니다. 그렇게 하면 효과가 있을 수 있지만 시행 착오로 인해 자신(및 플레이어)이 좌절할 수 있습니다.

대신 코드와 플레이어의 경험이라는 측면에서 플레이, 소셜 및 인증과 같은 다양한 세션을 계층화하여 이러한 개념에 전체적으로 접근할 수 있습니다.

세션 유형 #

세션이라는 용어는 추상적인 플레이 아이디어에서 게임 개발의 저수준 메커니즘에 이르기까지 다양한 맥락에서 다양한 의미를 나타내기 위해 과도하게 사용되는 경향이 있습니다. 인증을 위해 플레이, 로그인 및 인증 세션의 세 가지 유형을 고려합니다.

다른 세션 유형이 존재하며 게임에 대한 인증을 개발하는 역할을 수행합니다(예: 네트워크 TCP 세션 또는 암호화 TLS 세션). 이 주제에서는 이러한 기본 프로토콜이 작동한다고 가정하고 플레이어 상호 작용에 대해 주로 설명합니다.

플레이 세션 #

플레이 세션은 플레이어가 게임을 중단하기 전까지 플레이한 시간입니다. 플레이 세선과 길이는 게임 유형, 플랫폼 및 플레이어에 따라 다릅니다. 한 번의 차례, 라운드 또는 대결(또는 많은 턴, 라운드 또는 대결) 기간 동안 지속될 수 있으며 플레이어의 주의 지속 시간과 동기에 따라 달라질 수 있습니다.

플레이 세션은 플레이어가 게임을 경험하는 방식입니다.

로그인 세션 #

로그인 세션은 플레이어가 계정에 로그인한 시간입니다. 대체로 Google Play 게임, Apple 게임 센터 또는 자체 계정 인프라와 같은 공급자에 의해 결정됩니다.

로그인 세션은 게임에서 고유한 플레이어가 식별되는 방식입니다. 특정 플레이어를 추적할 수 있습니다.

인증 세션 #

로그인 세션은 클라이언트와 서버가 서로 신뢰할 수 있는 통신 상태에 있는 시간입니다. 이것을 Nakama 세션이라고 생각할 수도 있습니다.

세션 겹침 #

플레이어는 일반적으로 로그인 또는 서버 연결에 대해 아무런 관심이 없습니다. 플레이어는 게임과 게임 아님만 생각합니다. 그들은 자기 차례가 될 때마다 암호를 입력하거나 아래의 “연결 중” 화면을 보려고 하지 않습니다.

결과적으로 세션 유형이 겹치고 서로 종속됩니다. 이것이 로그인 및 인증이 게임을 지원하는 방법입니다: 이 두 가지는 플레이어가 잘 알아 볼 수 있도록 (희망적으로) 플레이 세션보다 길거나 짧게 실행됩니다.

로그인한 플레이어, 게임하는 데 시간을 보내는 플레이어, Nakama와 연결된 클라이언트 등 게임이 한 번에 여러 세션에 있다고 생각할 수 있습니다.

플레이어 행동과 세션 유형 간의 겹침
플레이어 행동과 세션 유형 간의 겹침

그러나 세션 유형은 서로 밀접하게 연결되어 있는 것이 아닙니다. 플레이어는 매일 몇 분 동안만 플레이할 수 있지만 며칠 또는 몇 주 동안 Apple 계정에 로그인된 상태를 유지할 수도 있습니다. 게임에 따라 서버 연결이 잠시 간헐적으로 설정되거나, 길게 유지될 수 있습니다. 세션은 플레이어 및 게임 활동과 관련하여 시작하고 종료해야 합니다.

세션 시작 #

클라이언트가 매치메이킹 또는 순위표 업데이트와 같은 작업을 서버에서 수행하려면 먼저 서버에서 클라이언트를 인증해야 합니다.

인증은 Nakama와의 세션 시작을 표시합니다. 일반적으로 게임이 시작될 때마다 인증합니다.

Nakama에서 세션 수명 주기는 다음과 같습니다:

  1. 세션을 시작합니다. 인증 API로 플레이어 또는 장치를 식별하면 Nakama가 세션 객체로 응답합니다.

  2. 세션 객체를 사용하여 요청합니다.

  3. 세션이 만료된 경우, 필요하면 새로 고치거나 재인증하십시오.

첫 번째 단계가 가장 복잡합니다. 클라이언트는 세션을 시작하기 위해 식별자로 인증을 요청합니다. 이 ID는 소셜 공급자의 OAuth 토큰, 장치 ID, 사용자 이름 및 암호, 자체 사용자 지정 서비스와 같은 다양한 곳에서 올 수 있습니다. 자격 증명이 어디에서 왔는지에 관계없이 모두 이 플레이어나 장치는 실행 중이며 다른 것은 실행 중이 아닙니다라는 의미를 갖습니다.

인증 및 소셜 프로필 #

여기에서 인증 세션과 로그인 세션 레이어가 함께 제공됩니다. 인증에 의해 플레이어의 로그인 세션이 Nakama 세션에 매핑됩니다.

일반적으로 인증 API와 함께 사용되는 식별자는 Apple 게임 센터 , GooglePlay 게임 또는 Facebook과 같은 소셜 공급자의 토큰입니다.

플레이어가 아직 로그인하지 않은 경우, 게임에서 로그인 흐름을 트리거하고 새 식별자를 가져오는 시기입니다. 플레이어가 로그인되어 있으면 이미 가지고 있는 식별자를 전달합니다.

플레이어의 로그인 ID로 인증할 때 플레이어의 로그인 ID를 Nakama 사용자 계정과 매핑합니다. 이런 식으로 플레이 세션, 로그인 세션 및 인증 세션을 함께 구성할 수 있습니다. 나중에 사용자 데이터가 필요한 경우 Nakama 사용자 ID 또는 소셜 공급자 ID로 조회할 수 있습니다.

세션 객체 제공 #

인증이 성공하면 Nakama는 JWT(JSON Web Token)라는 특수 세션 객체로 응답합니다. 이 세션 객체는 만료 날짜가 있는 건물 출입 카드와 같습니다. 이 카드가 있어야 문을 열 수 있습니다. Nakama 서버에 추가 요청을 하는 것입니다.

JWT는 암호화 서명된 JSON 객체입니다. Nakama 세션 객체 JWT에는 만료 날짜 및 시간을 포함하여 서버의 개인 키로 서명된 일부 세부 정보가 포함되어 있습니다.

JWT가 만료되지 않았거나 변조되지 않은 한 서버는 JWT를 안전하게 검증할 수 있습니다. 동시에 JWT는 암호화되지 않으므로 클라이언트 코드에서도 해당 내용을 검사할 수 있습니다.

다음은 인코딩된 형식의 JWT 예입니다.

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJmNDA4MmFhMC1hYWQwLTQ1MjYtODkwZC1iYTUwYjI0NmJlMTkiLCJ1c24iOiJhS25pWU5pZ1FiIiwiZXhwIjoxNTk3NjY3MjIwfQ.1fdAmq3nrDcPy0k6BwPCcULmhLiB54Z_feEuDaINNsA

디코딩하면 다음 JSON 객체가 됩니다.

1
2
3
4
5
{
    "uid": "f4082aa0-aad0-4526-890d-ba50b246be19",
    "usn": "aKniYNigQb",
    "exp": 1597667220
}

JWT에는 세 가지 주요 키가 있습니다:

  • uid - 인증된 Nakama 사용자 ID(Nakama 사용자 레코드에는 하나 이상의 소셜 식별자가 있을 수 있지만 이것은 사용자에 대한 Nakama의 고유 참조임)
  • usn - 사용자 이름
  • exp - Unix 타임스탬프 형식의 만료 날짜 및 시간

이 JWT가 포함된 코드는 Nakama에 대한 모든 새 요청과 함께 JWT(인코딩된 형식)를 제공합니다. Nakama에 대한 JWT 요청을 사용하는 것은 가벼우며 서버에서는 요청을 빠르게 확인할 수 있습니다. 암호화 서명으로 인해 Nakama는 데이터베이스 조회가 지연되지 않으면서 요청을 확인할 수 있습니다.

즉, 해당 JWT가 캐시됩니다! 유효한 세션 객체가 있는한, 대결 설정, 순위표 업데이트, 채팅 그룹에 플레이어 추가 등을 통해 플레이 세션을 지원할 수 있습니다.

세션 종료 방법 #

세션 객체는 Nakama 구성에 설정된 시간이 지나면 만료됩니다. 만료된 세션 객체로 요청을 시도하면 401 Unauthorized 오류와 함께 요청이 거부됩니다.

만료되면 Nakama에 새 요청을 할 수 없습니다(원래 토큰이 만료되더라도 활성 소켓 연결은 닫힐 때까지 계속됨). 계속 요청하려면 유효한 새로 고침 토큰을 사용하여 세션을 새로 고칠 수 있습니다.

새로 고침 토큰도 만료된 경우 처음으로 돌아가서 다시 인증해야 합니다.

그러나 그렇다고 해서 로그인 세션이나 플레이 세션이 동시에 종료된 것은 의미하는 것은 아닙니다. 예를 들어 게임 센터에 유효한 로그인 세션이 있고 플레이어가 여전히 활성 플레이 세션에 있는 경우 즉시 다시 인증할 수 있습니다. 플레이어에게 재로그인을 요청하거나, 다시 인증하기 위해 플레이어를 강제로 게임에서 내보낼 필요가 없습니다.

마찬가지로 세션이 종료되었다고 해서 바로 재인증해야 하는 것도 아닙니다. 플레이어의 다음 플레이 세션을 기다리거나 Nakama에 요청하는 특정 게임 작업을 기다릴 수 있습니다.

세션 종료가 유용한 이유 #

클라이언트에서 세션을 수동으로 종료하는 것이 유용한 경우도 있습니다. 예를 들어 사용자에게 게임 로그아웃 권한 부여, 사용자 계정 전환, 장치에서 로컬 상태 데이터 제거를 수동으로 실행할 수 있습니다.

세션을 수동으로 종료하는 옵션을 추가해야 하는 중요한 이유 중 하나는 사용자가 공유 장치를 사용하는 경우입니다. 수동으로 세션을 종료하고 로컬 세션 데이터를 제거하면 사용자 계정 및 게임 데이터에 대한 무단 액세스를 방지할 수 있습니다.

게임에 세션 관리 구축 #

게임에 여러 종류의 세션을 레이어링하는 것은 복잡해 보일 수 있습니다. 그러나 Nakama에서는 간단하게 해결할 수 있습니다.

서버에서 Nakama API는 일반 authenticate 엔드포인트와 함께 Apple, Facebook, Google 및 Steam과 관련된 엔드포인트를 제공합니다.

클라이언트에서 사용자의 언어 또는 엔진에 대해 Nakama 클라이언트를 사용하여 세션 인증, 세션 새로 고침 및 자동 세션 관리를 구성할 수 있습니다. 자세한 내용은 인증 예를 확인하세요.