서버 클라이언트

조회수 494회

개념적으로는 클라이언트에서 요청하고 서버에서 답한다고 그랬는데

예를 들어 회원가입같은 경우에서 클라이언트에서 아이디/ password를 서버에 넘기면 서버에서는 true/false 같은 형식으로 클라이언트에 답하는 형식으로 구성한다고 된다고 생각하는데 과연 이게 맞는 방법인지 그리고 보내는 형식은 post or get 이런 방식으로 하면 되는건지 ?

그러면 굳이 서버를 nodejs 이런 걸 로 하지말고 그냥 자바 스크립트에서 함수로 구현하면 되지 않는지 ?

또 서버 같은 경우에는 거의 함수랑 유사하지 않나라는 생각도 드는데 맞는 개념인지 ?

1 답변

  • Q1. 과연 이게 맞는 방법인지?

    A1. 네. 왜냐하면 지금 이게 하필이면 로그인(authorization)이라는 시나리오에 관한 것이기 때문입니다.

    Q2. 보내는 형식은 post or get 이런 방식으로 하면 되는건지 ?

    A2. 비밀번호를 GET 요청변수에 담아서 보내면 URI 자체에 비밀번호가 그대로 노출돼 버리니 아무래도 POST 방식으로 서버에 요청 보내는 게 낫지요.

    Q3. 그러면 굳이 서버를 nodejs 이런 걸 로 하지말고 그냥 자바 스크립트에서 함수로 구현하면 되지 않는지 ?

    A3. 아니요. 왜냐하면 지금 이게 하필이면 인증(authorization)이라는 시나리오에 관한 것이기 때문입니다.

    Q4. 서버 같은 경우에는 거의 함수랑 유사하지 않나라는 생각도 드는데 맞는 개념인지 ?

    A4. 서버 코드도 함수를 쓰고 클라이언트 코드도 함수를 쓰지요. 같은 JS라서 본질은 같은데요. 다만 그 함수가 사용자 인증(authorization)을 제대로 할 수 있느냐 없느냐의 차이가 있습니다.


    아까부터 자꾸 인증 시나리오가 어쩌구저쩌구 하는데 뭐냐 싶으시죠? 아주 극단적인 사례를 생각해 봅시다. 이런 웹페이지가 있다고 해 볼께요.

    <h1>작전과 전산망에 접속하려면 로그인하십시오.</h1>
    <p>무심코 흘린 아이디/비밀번호, <span class="red">적</span>의 먹잇감이 됩니다!</p>
    <form class="form-horizontal pt-3" id="loginForm">
      <div class="form-group row">
        <label class="col-md-3 col-form-label" for="username">아이디</label>
        <div class="col-md-9">
          <input type="text" name="username" class="form-control" />
        </div>
      </div>
      <div class="form-group row">
        <label class="col-md-3 col-form-label" for="password">비밀번호</label>
        <div class="col-md-9">
          <input type="password" name="password" class="form-control" />
        </div>
      </div>
      <div class="form-group row">
        <div class="offset-md-3 col-md-9">
          <button type="submit" class="btn btn-primary">로그인</button>
        </div>
      </div>
    </form>
    <script>
    var login = function (form) {
      var username = form.username.value;
      var password = form.password.value;
      if (username == '작전과' && password == '작전12!') {
        alert('작전과 로그인 성공');
        window.location.href = 'http://6.9.20.145/육군20사단145연대/작전과/index.jsp';
      } else {
        alert('작전과 로그인 실패');
        return false;
      }
      return false;
    };
    var loginForm = document.getElementById('loginForm');
    loginForm.addEventListener('submit', function (e) {
        e.preventDefault();
      login(e.target);
    });
    </script>
    

    이 웹페이지는 겉으로 봐서는 철통 보안이 된 것 같습니다.

    하지만 F12 눌러서 소스를 까보는 순간 작전과 아이디가 작전과이고 비밀번호가 작전12!라는걸 바로 알 수 있죠. 인증이 무의미해지는 것입니다.

    하지만 만약 usernamepassword 입력값을 특정 서버로 요청 보내서, 그 서버의 응답만 가지고 작전과 로그인이 가능한지 어떤지 알 수 있게 바꾼다면, 적어도 F12 한방에 보안이 뚫리는 어처구니 없는 일은 일어나지 않겠지요?

    그래서 사용자 인증 시나리오에서는 어쩔 수 없이 (ㅎㅎ) 인증 로직이 서버단에 할당됩니다.

    뭐 다른 시나리오라면 서버까지 갈 필요 없지요. 예를 들면 전역계산기 같은 거. 그건 그냥 입대한 날짜만 입력하면 공식에 맞춰 계산하는 게 전부기 때문에 서버가 데이터를 받아서 클라이언트와 분리된 독립적인 로직을 수행할 필요가 없지요. 함수만 잘 만들어서 입력 출력 해주면 될 뿐이니까요. 그래서 전국 수많은 군부대 행정반의 전역계산기들이 서버는커녕 인터넷 연결조차 없지만 그래도 잘 작동하는 것입니다.

    답변이 되었는지 모르겠네요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)