sha256을 통해 아이디용으로도 salt를 만들어서 아이디도 암호화하고 로그인 체크에서 사용자와 입력한 아이디와 ID-salt를 조합하여 아이디 체크를 하도록 하여 혹여나 DB가 털릴 시에 ID도 노출되지 않도록 하고 싶은데, 연산에 많은 시간이 걸리려나? 그리고 ID도 암호화할 시에 관리자 입장에서 난처한 상황이 많이 발생하려나?
A.
아이디를 해싱 및 솔트 처리하여 저장하는 방법은 보안을 크게 향상시키지만, 몇 가지 고려사항이 필요합니다. 이런 방식으로 아이디를 처리할 경우의 장단점과 고려사항을 설명하겠습니다.
장점
보안 강화: 데이터베이스가 유출되더라도 아이디와 비밀번호가 해시 처리되어 있기 때문에 평문 아이디와 비밀번호를 알아내기 어렵습니다.
프라이버시 보호: 유저의 아이디가 노출되지 않으므로 개인정보 보호에 유리합니다.
단점 및 고려사항
관리의 복잡성: 관리자 입장에서 사용자의 아이디를 직접 확인할 수 없으므로 문제 해결이 어려울 수 있습니다. 예를 들어, 특정 사용자를 찾거나 문제가 발생했을 때 사용자를 식별하는 데 어려움이 있습니다.
성능: 해싱 알고리즘은 비교적 빠르지만, 사용자 수가 많아질수록 로그인 처리에 시간이 조금 더 걸릴 수 있습니다. 하지만 일반적인 사용 환경에서는 크게 문제되지 않을 것입니다.
복구 불가능: 해싱된 아이디는 복구가 불가능하므로 사용자가 아이디를 잊어버리면 새로운 아이디를 생성해야 할 수 있습니다.
Json 데이터를 서버에 전달하여 파일로 저장하거나, 데이터를 읽고, 폴더 내 전체 데이터의 리스트를 클라이언트에서 전달받아 확인하는 등 테스트를 진행 중
데이터는 API 서버 외의 공간에 저장하는 게 좋겠지만 스케일이 커지고 힘들어질 듯 하여 일단 서버에 데이터를 보관한다.
현재 클라우드타입에서 배포를 하고 있는데, 서비스를 중단하면 그간 저장된 데이터가 사라지기 때문에 클라우드타입을 계속 사용한다면 외부에의 데이터 저장은 필수이기는 하다.
엔드포인트에 적절한 이름을 부여하고 싶은데 딱 맞는 게 떠오르지 않아 계속 바뀌는 중.
아무튼 클라우드타입의 계속적인 사용을 위해서는 서비스 중단 시에 파일 전체를 어딘가로 백업하는 등의 꼼수를 통해 해결해야만 한다.
현재 떠오르는 아이디어는 깃허브 리포지토리를 새로 하나 데이터 보관용으로 새로 작성하여, 저장된 플레이어 데이터를 해당 리포지토리에 백업하고, 서비스를 다시 시작할 때 리포지토리에 저장된 내용을 클론하여 가져오는 방법 등을 생각할 수 있다.
여담으로 디스코드에도 서버를 하나 작성하여 앨범 데이터를 위한 채팅채널을 하나 작성하여 길드 앨범으로 활용하고 있는데, 어느샌가 그 채팅채널의 내용이 스멀스멀 지워지고 있어 대체할 스토리지가 필요한 참이다. 이쪽은 크기가 꽤 커 깃허브를 활용하기에는 조금 부담이 되는 케이스.
게임 서버를 구축할 때 Python을 사용하는 것은 충분히 가능하며, Node.js와 마찬가지로 여러 장점이 있습니다. 언어 선택은 주로 프로젝트의 요구사항, 팀의 기술 스택, 성능 요구사항, 개발자의 선호도에 따라 결정됩니다. 다음은 Python을 게임 서버에 사용하는 것의 장단점과 Node.js와의 비교입니다.
Python을 사용하는 장점
사용이 쉬움: Python은 문법이 간단하고 직관적이어서 빠르게 개발할 수 있습니다.
풍부한 라이브러리: 다양한 라이브러리와 프레임워크(예: Flask, FastAPI, Django 등)를 통해 웹 서버와 API를 쉽게 구축할 수 있습니다.
강력한 커뮤니티 지원: 풍부한 문서와 커뮤니티 지원을 받을 수 있습니다.
데이터 처리 및 AI: 게임 데이터 분석, 통계 처리, 머신러닝 등과 같은 작업에 매우 적합합니다.
Python을 사용하는 단점
동시성 문제: Python의 GIL(Global Interpreter Lock)로 인해 CPU 집약적인 작업에서는 성능이 떨어질 수 있습니다. 그러나 asyncio, gevent, concurrent.futures 등을 활용하면 많은 동시성 문제를 해결할 수 있습니다.
성능: Node.js에 비해 일부 네트워크 IO 작업에서 느릴 수 있습니다. 이는 주로 Node.js가 비동기 이벤트 기반 모델을 사용하기 때문입니다.
Node.js를 사용하는 장점
비동기 처리: Node.js는 비동기 이벤트 기반 아키텍처를 사용하여 높은 처리량과 확장성을 제공합니다.
성능: V8 엔진을 사용하여 빠른 자바스크립트 실행 속도를 제공합니다.
풀스택 자바스크립트: 프론트엔드와 백엔드 모두 자바스크립트를 사용할 수 있어 코드 공유와 유지보수가 용이합니다.
실시간 처리: WebSocket 등을 통한 실시간 데이터 처리에 매우 적합합니다.
Node.js를 사용하는 단점
단일 스레드: Node.js는 단일 스레드 모델이므로 CPU 집약적인 작업에서는 성능이 저하될 수 있습니다.
콜백 지옥: 비동기 코드를 많이 작성할 경우 콜백 지옥(Callback Hell)에 빠질 수 있으나, async/await를 사용하여 이를 해결할 수 있습니다.
결론
Python과 Node.js 모두 게임 서버 구축에 적합하며, 선택은 주로 다음 요소에 따라 결정됩니다:
팀의 기술 스택: 팀이 이미 Python에 익숙하다면 Python을 선택하는 것이 효율적입니다.
프로젝트 요구사항: 실시간 처리와 높은 동시성 요구사항이 있다면 Node.js가 더 적합할 수 있습니다.
개발 속도와 편의성: Python은 간단한 문법과 풍부한 라이브러리로 인해 빠른 개발을 도울 수 있습니다.
예시
게임 서버의 간단한 예시로 Python의 FastAPI와 Node.js의 Express.js를 사용한 예제를 비교해 보겠습니다.
"MonoBehaviour"는 유니티 엔진에서 가장 기본적인 스크립트 클래스입니다. 이 클래스의 이름에는 두 가지 중요한 요소가 있습니다: "Mono"와 "Behaviour".
1. Mono
"Mono"는 그리스어로 "하나" 또는 "단일"을 의미합니다. 유니티 엔진은 "Mono" 프로젝트를 기반으로 하고 있습니다. Mono는 .NET 프레임워크의 오픈 소스 구현체로, 다양한 플랫폼에서 .NET 애플리케이션을 실행할 수 있게 합니다. 유니티는 이 Mono 프로젝트를 사용하여 C# 스크립트를 지원하고, 다양한 플랫폼에서 실행될 수 있도록 합니다.
유니티의 초기 버전들은 Mono를 사용하여 스크립트를 처리했습니다. 현재는 .NET Core와 IL2CPP 등의 기술도 사용되고 있지만, MonoBehaviour라는 이름은 그대로 유지되고 있습니다.
2. Behaviour
"Behaviour"는 행동, 동작을 의미합니다. 게임 오브젝트에 스크립트를 통해 동작을 부여하는 역할을 하는 클래스임을 나타냅니다.
MonoBehaviour는 유니티에서 모든 스크립트가 상속해야 하는 기본 클래스이며, 이 클래스를 통해 게임 오브젝트의 동작을 정의하고 제어할 수 있습니다. 예를 들어, 게임 오브젝트의 업데이트, 물리 계산, 사용자 입력 등을 처리할 수 있습니다.
결론
"MonoBehaviour"는 Mono 프로젝트 기반의 .NET 스크립팅 환경에서 게임 오브젝트의 동작을 정의하기 위해 사용되는 클래스입니다. 이름 자체는 유니티가 Mono 프레임워크를 사용하여 스크립트를 처리하고, 이를 통해 게임 오브젝트의 행동을 정의하는 역할을 한다는 의미를 담고 있습니다.
이를 통해 유니티 개발자들은 C#을 사용하여 게임 오브젝트의 동작을 정의하고, 다양한 플랫폼에서 실행될 수 있는 강력한 스크립트를 작성할 수 있습니다.