문제 배경

: 서버의 검증없이 클라이언트 데이터를 그대로 신뢰

게임결과 저장 API는 게임종료후, 게임 진행시간동안 사용자가 입력한 정답 데이터들과 게임점수들을 클라이언트에서 메모리상에 임시로 저장했다가, 백그라운드로 임시로 저장된 데이터들을 데이터베이스에 저장하여 게임세션 ID를 리턴합니다. 아래 시퀀스 다이어그램은 게임 기능에 대한 전반적인 프로세스입니다.

시퀀스 다이어그램

시퀀스 다이어그램

프론트엔드 파트에서 게임 진행시간동안 사용자의 얻은 점수들을 계산하여 게임종료후 최종점수을 반영하기로 했습니다. 팀 개발자 모두 해당 플로우로 숙지하여 게임결과 저장 API의 Request Body로하여 게임 결과 저장 API 개발을 완료 하여, PR을 생성했습니다.

동료의 코드리뷰를 진행하기전에 AI 엔진으로 코드리뷰를 요청했습니다. 아래와 같은 잠재적인 보안이슈 리뷰 코멘트를 남겨줬습니다.

<aside> 🤖

[ 리뷰 코멘트 ]

클라이언트가 보낸 점수를 서버에서 검증 없이 그대로 신뢰하고 있습니다. 악의적인 클라이언트는 실제로 푼 문제에서 얻은 점수와 맞지 않는, 부풀려진 점수를 전송할 수 있습니다. 서버는 클라이언트가 준 점수 값을 그대로 받지 말고, 풀린 문제와 그 난이도 정보를 기반으로 직접 점수를 계산해야 합니다.

</aside>

그래서 여기서 궁금함이 생겼습니다.

  1. 클라이언트에서 보낸 데이터를 서버의 검증없이 사용하는게 왜 위험할까?
  2. 악의적으로 클라이언트가 데이터를 보내는 현상이 많을까?

(1) 클라이언트에서 보낸 데이터를 서버의 검증없이 사용하는게 왜 위험할까?

클라이언트는 사용자가 완전히 통제할 수 있는 환경이라는 점 때문 입니다.

[이유 1] 누구나 조작이 가능하며, 클라이언트 값 그대로 데이터베이스 저장이 될 수 있습니다.

브라우저의 개발자도구나, Postman 등으로 API 입력데이터 포맷에 맞춰 요청데이터를 조작할 수 있기 때문입니다. 예를들어 서버검증이 없다면, 실제로는 0문제 맞췄는데 얻은점수는 9999점 으로 요청하게되면 데이터베이스에 9999점을 그대로 저장하게 됩니다.