서버를 작성할 때 로그인과 게임 로직을 분리하는 방법은 무엇입니까?


9

나는 게임 서버와 같은 포커를 만들고 있는데, 모든 로그인과 게임 로직을 하나의 서버에서 처리하려고했지만 웹에 대한 연구에서 이것이 확장되지 않는다는 사실을 알게되었으며, 분할하는 것이 합리적이라고 생각합니다 로그인 및 게임 서버로의 작업. 그러나 내가 얻지 못하는 것은 로그인 서버에서 인증을 처리하고 클라이언트가 게임 서버에 새로 연결하도록 한 것입니다. 어떤 클라이언트가 어떤 클라이언트인지 어떻게 알 수 있습니까? 다시 로그인하지 않아도되므로 로그인 서버를 사용하려는 목적을 상실 할 수 있습니까? 내가 모르는 프로세스와 시스템간에 연결을 전달할 수있는 방법이 있습니까? 네트워킹에 대한 나의 작은 지식을 실례합니다.


4
YAGNI : 당신은 그것을 필요로하지 않을 것입니다. 조기 최적화를 구현하지 마십시오. 로그인은 게임에서 매우 사소한 부분처럼 들리므로 분할해도 아무런 이점이 없습니다. 게임에 관심이있는 충분한 사용자가 있으면 (단일 서버에서 1000 명의 사용자를 지원하고 다른 서버는 중복성을 지원할 수 있어야 함) 이러한 종류의 것을 이해하는 일부 소프트웨어 엔지니어를 고용 할 수 있습니다.
MarkR

오해의 소지가있는 답변을 수락 했으므로 신중하게 재고해야합니다. 그렇지 않으면 머리에 잘못된 개념과 코드에 대한 잘못된 보안 감각이 생길 수 있습니다.
o0 '.

게임 서버와 로그인 서버 사이에 추가 연결이 필요하지 않기 때문에 Kylotan의 답변이 마음에 들었습니다. 또한 비밀 키의 타협은 운송중인 모든 계정의 타협이라는 필립의 견해도 알 수 있습니다. 로그인 버전을 모두 구현하고 코드 감사를받을 때 보안 전문가에게 문의합니다. 내 질문은 매우 기본적으로 보이며 모든 사람들이 동의하는 표준 솔루션이 될 것으로 기대했습니다. 그림을 이동. 보안 전문가 만이 토론에 참여하여 결정을 내릴 수 있다면.
user342580

엄밀히 말하면 서버간에 로그인 토큰을 전달하는 것이 더 안전하며 안전한 채널을 제공합니다. 또한 구현하기가 더 어려워서 잘못 될 위험이 높아집니다. 누군가가 귀하의 비밀 키를 보유 할 수없는 경우가 아니라면 해시 기반 메시지 인증 시스템은 완벽하게 안전해야합니다. 내부 시스템에 액세스하여 키를 보유 할 수있는 경우 로그인을 보내도 해결되지 않는 문제가 있습니다. 수동으로 토큰.
Kylotan

답변:


3

Philipp의 답변은 완벽하지만, 로그인 서버와 게임 서버 사이에 연결이 필요하지 않은 약간 다른 방법이 있습니다. 이러한 연결이 어려운 경우에 유용합니다.

  1. 사용자가 로그인 서버에서 성공적으로 인증되면 위와 같이 게임 서버 주소와 로그인 토큰이 전송됩니다. 그러나이 토큰은 로그인 서버에서의 시간과 해당 번호의 해시 및 사용자 이름, IP 주소, 게임 서버의 IP 주소 또는 ID 및 본인 만 알고있는 비밀 키의 두 부분으로 구성됩니다.
  2. 클라이언트는이 토큰을 보내 제공된 게임 서버에 로그인을 시도합니다. 서버는 로그인 토큰의 정보와 자체 IP 주소 / ID 및 비밀 키를 기반으로 이전과 동일한 해시를 형성합니다. 이 해시가 토큰의 해시와 일치하면 플레이어가 올바르게 인증 된 것입니다. 그런 다음 날짜가 너무 오래된 지 확인하십시오 (예 : 1 분 이상).

이것은 다음과 같은 이유로 작동합니다.

  • 날짜가 만료되어 복사 및 재사용 할 수 없습니다.
  • 비밀 키를 모르면 새로 로그인하지 않고는 구성 할 수 없습니다.
  • 다른 사람이 (예 : 패킷 스니퍼를 사용하여) 쉽게 가로 채지 못하고 원래 IP 주소가이를 구성하는 데 사용되므로 사용할 수 없습니다.
  • 사용자 이름이 해시의 일부를 구성하기 때문에 다른 계정에 사용할 수 없습니다.
  • 서버의 ID / IP 주소가 해시의 일부를 구성하므로 다른 게임 서버에서 동시 로그인에 사용할 수 없습니다.

간단히 말해 해시는 발신자가 로그인 토큰을 위조하는 것이 거의 불가능하므로 토큰의 정보를 신뢰할 수 있습니다.

보안 지향 해싱과 마찬가지로 사람들이 bcrypt, PBKDF2 및 scrypt를 좋아하는 것처럼 보일 수있는 최고의 해시 기능을 사용하고 비밀 키의 길이가 너무 길어 무차별 복제가 실용적이지 않도록하십시오.


매우 영리하며이 솔루션을 선호합니다. 내 질문은 비밀 키입니다. 암호 문구 나 다른 것이어야합니까? 사용자마다 달라야합니까?
user342580

이것은 작동하지 않거나 실제로 @Philipp의 답변을 숨겨진 다시 구현합니다. 로그인 서버와 게임 서버 모두 동일한 비밀 키를 알고 있다고 가정하기 때문에 실패합니다. 둘 다 키를 알고있는 경우 그 중 하나가 다른 키를 제공해야합니다. 또는 둘 다 보내려면 타사가 필요합니다. 어느 쪽이든, 전처럼 스니핑 할 수 있습니다.
o0 '.

@Lohoris, 당신은 로그인과 게임 서버를 모두 소유하고 비밀 키를 제공 할 수 있다는 아이디어입니다. 두 서버를 모두 소유하지 않은 경우 게임 서버가 어떻게 로그인 서버의 인증을 신뢰할 수 있습니까?
Kylotan

@ user342580 : 일종의 긴 문구를 사용합니다. 사용자마다 다를 필요는 없지만, 그렇게해도 아프지 않습니다. 암호화 해시 기능이 충분히 강력하고 주기적으로 변경하는 한 중요하지 않습니다.
Kylotan

@Kylotan은 정확히 어떻게 키를 제공합니까? 서버에서 서버로의 연결보다 서버에서 서버로의 연결이 더 안전한 이유는 무엇입니까?
o0 '.

8
  1. 사용자가 로그인 서버에 자신을 인증 한 후에는 토큰 (추측하기에는 너무 길고 무작위로 생성 된 고유 한 문자열)을 제공하십시오.

  2. 로그인 서버는 게임 서버를 선택합니다. 로그인 서버에서 선택한 서버로 사용자에 대한 토큰, 사용자 이름 및 기타 모든 관련 데이터를 보냅니다.

  3. 게임 서버의 토큰과 호스트 이름을 클라이언트에게 보냅니다. 그런 다음 로그인 서버에서 연결을 끊습니다.

  4. 클라이언트는 사용자 이름과 토큰으로 게임 서버에 연결합니다.

  5. 클라이언트의 토큰이 로그인 서버에서 방금보고 한 토큰과 일치하면 수락합니다.

이것을 안전하게하기 위해서는, 암호로 안전한 난수 생성기에서 토큰을 생성해야합니다. 각 토큰은 게임 서버에 의해 한 번만 허용 될 수 있으며 사용되지 않은 토큰은 몇 분 후에 폐기되어야합니다.


그렇다면 암호화만으로도 충분할까요? bcrypt를 사용하여 시간 + 사용자 이름 + 비밀번호의 해시에서 토큰을 만들려고합니다.
user342580

나는 것 같아요. 암호를 알면 토큰을 추측 할 수 있지만 암호를 알면 정상적인 방법으로 로그인 할 수 있습니다.
Philipp

1
bcrypt는 입력이 적절하게 임의적이고 예측할 수없는 한 작동합니다. 시간 만 사용하면 공격자가 시간을 예측 한 다음 bcrypt를 실행하고 토큰을 얻을 수 있습니다. 시간 또는 보안 임의 추출기 (예 : UNIX / Linux 시스템의 / dev / random)와 함께 비밀 솔트를 사용하십시오.
Sean Middleditch 2013

다른 사이트에서 암호가 손상되었을 수 있으므로 적절한 암호라고 가정하지 않습니다.
Sean Middleditch 2013

1
@SeanMiddleditch 암호가 손상되면 모든 보안이 손실됩니다. 암호를 얻은 공격자는 정상적인 방법으로 로그인하여 토큰을 얻을 수 있기 때문에 토큰을 추측 할 이유가 없습니다.
Philipp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.