관리 메뉴

cyphen156

파일 정합성 인증 - 무결성 검사 정책 정하기 본문

프로그래밍/C#

파일 정합성 인증 - 무결성 검사 정책 정하기

cyphen156 2026. 1. 10. 16:09

클라이언트 사이의 멀티플레이를 지원하기 위해 서로 다른 유저간의 컨텐츠 보유 상황이 모두 일치하는지 여부를 반드시 확인하고, 이에 따라 서버는 지원할 수 있는 서비스가 어디까지인지를 결정해야 한다.

나는 이에 대한 정책을 로컬 플레이 시에는 컨텐츠가 없으면 그 컨텐츠는 플레이를 차단하고, 멀티플레이 시도시에는 반드시 모든 컨텐츠가 서버 기준으로 동기화가 되어 있어야 멀티플레이를 지원받을 수 있도록 계획을 세웠다.

 

여기서 발생하는 과정이 유저가 가지고 잇는 컨텐츠에 대한 서버와의 정합성, 그리고 개별 컨텐츠들의 무결성인데. 

마찬가지로 멀티플레이에 필요한 기능들만 정합성 통과시킬지 아니면 모든 컨텐츠가 정합성을 가지는지를 조사해야한다.

 

나는 이것을 게임을 부팅하고 난 이후 1회에 한해 전수조사 하기로 마음먹었다. 실제로 모든 번들을 다 까보면서 전수조사하는 방식은 아니고, 

로컬 플레이 시점에서 컨텐츠 동기화 함수를 약간 수정하여 컨텐츠 메타 파일이 최신이면 본문 파일이 최신임을 믿고 사용하는 계약에서 
멀티플레이 한정으로 메타가 최신이어도 본문 자체를 비교하는것이 아닌 본문에 대한 해시값을 서버가 내려준 메타에 기록된 해시와 일치하는지 여부를 확인하기로 했다. 

 

여기서 발생하는 비용은 네트워크 비용도 물론 있겟지만, 

로컬에 저장된 컨텐츠는 어드레서블 번들이 있기에. 이 번들의 크기가 매우 클 수 있다는것을 고려해야 한다는 것이었다. 

그래서 결정한 법칙들이다.

제 1법칙 : 해시는 과정은 항상 보호받아야 하기에 독립적인 흐름이 보장받아야 한다. 

해시연산은 그 특성상 단 한글자라도 입력이 다르다면 결과가 다르게 나온다. 물론 동일하게 나올 가능성이 아예 없는것은 아니지만, SHA - 256을 기준으로 현존 최고 슈퍼컴퓨터를 가지고도 100년이 걸려도 일치하는 해시를 찾을 수 있을지는 알 수 없다. 때문에 번들에 대한 해시 스트림을 만들어줘야 했다.

 

제 2법칙 : 해시 계산을 하더라도 백그라운드에서 하자

앞서 번들 파일의 크기가 아주 클 수 있다고 가정을 했다. 유저 입장에선 이런 해시가 돌아가는 과정을 알고싶지도 않고 그것을 배려해줄 이유가 전혀 없다. 때문에 메인 스트림에서 해시과정을 돌리면 반드시 블로킹이 나서 화면이 멈추는 렉이 발생하게 된다. 

이것을 방지하려면 멀티스레드 환경에서 작업을 수행하던지, 서브 루틴으로 빼줘서 비동기 또는 병렬 연산을 지원해야 한다.

선택지는 유니테스크, 잡시스템 등이 있는데, 나는 태스크를 선택했다.

 

제 3법칙 : 파일 입출력은 항상 RM만 한다.

이건 내 기준이자 고집이다. 해시인증과정이 RM 내부의 CMS를 통해 연산된 다 할지라도 File I/O, Network I/O, Resource Save/Delete 과정은 모두 RM만이 할 수 있다는 기준점이었다.

 

여기서 드는 의문점 

그럼 해시계산은 어떻게, 실패나 중단의 과정 처리는 어떻게 판단할 것인가?

 

두가지 선택지가 생겻다.

1. 정적 유틸리티로서의 Hash Utility

 

2. 유틸리티 성격의 클래스로서의 Hash Context 

각각이 장단점이 있다. 

1번의 기준은 다음과 같다. 외부에서 어떻게 처리하던지 유틸리티는 관심이 없다. 

그것이 중단되거나 실패하는것에도 관심이 없다. 그저 보내온 데이터를 해시연산하여 그 결과를 리턴한다. 

필연적으로 외부에서 이 결과값을 받는 쪽에 정책 결정이 생긴다.

 

2번의 기준은 다음과 같다. 해시 연산 과정에는 외부는 관심이 없다. 단지 결과만 어떻게 되엇는지를 뱉어내라.

중단되거나 실패하는 경우는 그것이 무었때문에 발생했는지를 기록해서 넘겨줘라. 그리고 그 값과 원인을 기준 내가 추가적인 처리를 할거다

 

 

내 성향상 1번의 선호가 끌린다. 

어차피 해시 값이 단 1개라도 틀리면 그것은 무결성 검증에 실패한 것이고, 정합성 보장이 깨진것이다.

서버입장에선 반드시 다시 검사하라고 요구해야한다. 

하지만 만일 파일자체가 무결하고 다시 검사하면 정합성이 보장되는데 무조건 업데이트 하라고 지시하면 쓸데 없이 업데이트 하는 꼴이 된다. 

하지만 괜찮다. 중요한건 그게 아니라 일관성 여부니까 

서버입장에선 게이트웨이도 못넘어왔어? 다시시도해봐라고 하고 유저는 선택할것이다. 다시 해시인증을 시도해 볼 것인지 아니면 업데이트하고 시도해볼것인지