본문 바로가기

WEB etc

유효성 검사는 서버 / 클라이언트 중 어느 쪽에서 이루어져야 하는가?

둘 다. 이유는 :

Client Side

먼저 당신은 client-side에서 입력값 유효성 검사를 하기를 원할 것이다. 왜냐하면 보통의 사용자에게 좀 더 나은 피드백을 줄 수 있기 때문이다. 그들이 유효하지 않은 email을 입력하고 다음 필드로 넘어간다면, 우리는 즉시 에러메시지를 보여줄 수 있다. 이 방법은 사용자가 submit 버튼을 누르기 전 모든 필드를 수정하게 할 수 있다.

만약 서버에서만 유효성 검사를 한다면 사용자는 form 양식을 제출할 것이고, 에러메시지를 받은 뒤 문제를 다시 고쳐나가야 할 것이다. (서버에서 사용자가 입력한 원래 input 값을 유지한 상태로 다시 렌더링하면 이 고통을 줄일 수 있지만, client-side가 여전히 더 빠르다.)

Server Side

당신은 악의적인 사용자들로부터 보호받기 위해 server-side에서도 유효성 검사를 원할 것이다. 그들은 당신의 자바스크립트를 쉽게 우회할 수 있고 위험한 값을 서버에 전달할 수 있다. 

당신의 UI를 믿는 것은 굉장히 위험하다. 그들(악의적인 사용자)은 UI를 악용하거나 UI, 심지어는 브라우저까지도 전혀 사용하지 않을 지도 모른다. 사용자가 직접 url을 수동으로 편집하거나, 그들의 자바스크립트를 실행하거나, 다른 도구로 HTTP 요청을 비틀면 어떻게 되겠는가? 예를 들어 그들이 컬이나 스크립트로 custom http 요청을 보낸다면?

(이것은 이론적인 것이 아니다. 예를 들어 나는 사용자가 각 회사의 검색 form을 채운 것처럼 POST 요청을 보내서 많은 항공사, 버스 회사 등에 사용자 검색을 다시 제출한 여행 검색 엔진을 연구한 다음 모든 결과를 수집/정렬했다. 그 회사의 자바스크립트는 실행되지 않았고, 반환된 html에 에러 메시지를 제공하는 것이 우리에겐 중요했다.)

이를 허용하지 않는 것은 보안 측면에서 순진하기 짝이 없을 뿐만 아니라 비표준이기도 하다. 클라이언트는 원하는 모든 방법으로 http를 보낼 수 있어야 하고 서버는 그 요청에 올바른 응답을 해야 한다. 그 응답엔 검증도 포함된다.

server-side 유효성 검사 또한 호환성을 위해 중요하다. 
사용자가 브라우저를 사용 중이라 하더라도, 그들 모두가 자바스크립트를 사용할 수 있는 것은 아니다. 

추가

server-side에서 제대로 수행할 수 없는 유효성 검사가 있고, 데이터베이스의 상태에 의존하고 있기 때문에 client-side에서 완전히 불가능한 검사도 있다. 

예를 들어 "사용할 수 있는 ID입니다.", "요청한 날짜가 예약 가능한 날짜입니다.", "구매하기에 잔액이 충분합니다." 등등...

오직 데이터베이스만이 관련 데이터에 의존하는 데이터를 신뢰있게 검사할 수 있다. 개발자들은 이 문제를 정기적으로 해결하지만, PostgreSQL이 괜찮은 솔루션을 제공하고 있다. 


https://stackoverflow.com/questions/162159/javascript-client-side-vs-server-side-validation