인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지

유저 인벤토리 Pt.2 (UserInventoryData, UserDataManager)

유저 인벤토리 Pt.2

해결된 질문

작성

·

116

·

수정됨

1

InventoryItemDataList에 유저가 보유한 아이템 목록이 저장하고 해당 리스트 객체를 PlayerPrefs로 저장할 때 JSON을 쓰는 이유는 PlayerPrefs에서 int, float, string만 저장할 수 있기 때문에로 이해했는데 맞나요?

 

그리고 굳이 JSON 이여 할 이유가 있나요?

 

또 PlayerPrefs에 유저가 접근이 가능하다고 하는데

그러면 악의적으로 변형이 가능하지 않나요?

이 경우는 어떻게 대비하나요?

답변 3

1

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

안녕하세요! BurningCarrot입니다.

질문해 주셨던 2,3번 내용에 대한 보충 강의를 업로드 해 드렸습니다. [섹션8. 보충]을 확인하시길 바랍니다.

image.png

 

1

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

 

1. JSON을 쓰는 이유는 PlayerPrefs에서 int, float, string만 저장할 수 있기 때문에로 이해했는데 맞나요?

네 맞습니다. 단순하게 int, float, string 값으로 저장할 수 없는 복잡한 형태의 데이터를 JSON 형태의 string값으로 변환하여 저장하는 것입니다.

 

2. 그리고 굳이 JSON 이여 할 이유가 있나요?

JSON이 아닌 binary를 사용하여 저장하는 방법도 있습니다. Binary 방식을 사용하면 메모리와 최적화에서의 장점이 있지만 디버깅이 어렵다는 단점이 있습니다. JSON과 binary 둘 중에 어떤 방법을 사용하셔도 상관 없습니다.

 

3. PlayerPrefs에 유저가 접근이 가능하다고 하는데 그러면 악의적으로 변형이 가능하지 않나요? 이 경우는 어떻게 대비하나요?

악의적인 변형을 막기 위해 저장 시 암호화를 하는 방법이 있습니다. 암호화 저장을 위해서는 모든 저장 데이터를 string으로 변환 -> 암호화된 string으로 변환 -> 암호화된 string 값을 playerprefs에 저장 이라는 3가지 절차를 거쳐야 합니다. 이 외의 방법으로는 playerprefs가 아닌 원격 DB에 유저 데이터를 저장하는 방법이 있습니다. 이는 Pt.2에서 다룰 예정입니다.

 

질문에 주신 내용은 다른 수강생 분들에게도 도움이 될 것 같아 2,3번에 대한 내용은 보충 강의를 통해 실제 코드를 제공해 드리겠습니다. 다음 주에 보충 영상을 업로드하면 공지해 드리겠습니다.

추가로 궁금하신 점이 있으시다면 편하게 질문 부탁 드립니다. 🙂

 

0

안녕하세요, 인프런 AI 인턴입니다. moonfgg님.

질문해주신 내용과 관련하여 정보를 제공해드리겠습니다.

JSON을 사용하는 이유

PlayerPrefs는 지원하는 데이터 타입이 제한적이기 때문에, 복잡한 객체나 리스트를 저장할 때 JSON 형식을 사용하여 문자열로 변환하여 저장하는 것이 일반적입니다. 이는 여러 가지 데이터를 문자열로 직렬화하여 저장할 수 있도록 해주기 때문입니다. 따라서, JSON을 사용하는 이유가 맞습니다.

PlayerPrefs 보안 문제

PlayerPrefs에 저장된 데이터는 일반 텍스트로 저장되며, 게임 사용자들이 악의적으로 데이터를 변조할 수 있습니다. 이러한 문제를 방지하기 위한 일반적인 방법은 다음과 같습니다:

  1. 데이터 암호화: 데이터를 저장하기 전에 암호화하여 저장합니다. 이를 통해 사용자가 데이터를 쉽게 읽거나 변조할 수 없도록 합니다.

  2. 무결성 체크: 게임 실행 시 주요 데이터의 무결성을 확인하는 로직을 추가하여 변조 여부를 검사합니다. 예를 들어, 특정 값의 해시를 저장해둔 후, 게임 실행 시 해당 해시 값을 확인하는 방법이 있습니다.

  3. 서버 검증: 가능한 경우, 중요한 데이터는 클라이언트가 아닌 서버에서 관리하여 클라이언트 변조에 대한 영향을 줄입니다. 클라이언트는 데이터를 요청하고 서버는 검증된 데이터를 반환하는 방식입니다.

관련된 기존 질문과 답변을 통해 더 많은 정보를 얻을 수 있을 것입니다. 아래 링크를 참고해주세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

질문하기