본문 바로가기
Java

[Java] HTTP 웹 서버 구현 / GET 방식으로 회원가입

by bkuk 2023. 3. 17.

GET 방식으로 회원가입

사용자가 입력한 값을 파싱(문자열을 원하는 형태로 분리하거나 조작하는 것을 의미)해 model.User 클래스에 저장한다.

 

  <form name="question" method="get" action="/user/create">
      <div class="form-group">
          <label for="userId">사용자 아이디</label>
          <input class="form-control" id="userId" name="userId" placeholder="User ID">
      </div>
      <div class="form-group">
          <label for="password">비밀번호</label>
          <input type="password" class="form-control" id="password" name="password" placeholder="Password">
      </div>
      <div class="form-group">
          <label for="name">이름</label>
          <input class="form-control" id="name" name="name" placeholder="Name">
      </div>
      <div class="form-group">
          <label for="email">이메일</label>
          <input type="email" class="form-control" id="email" name="email" placeholder="Email">
      </div>
      <button type="submit" class="btn btn-success clearfix pull-right">회원가입</button>
      <div class="clearfix" />
  </form>

 

 

HTTP Header

GET /user/create?userId=tester1&password=test1&name=테스터 HTTP/1.1

 

  • HTTP 요청의 첫 번째 라인에서 요청 URI을 추출
  • 요청 URI에서 접근 경로와 key=value 형식으로 전달되는 데이터를 추출해서 Model 클래스에 담는다.

 

GET 방식의 회원가입

GET /user/create?userId=tester1&password=test1&name=테스터 HTTP/1.1

위의 코드는 GET 방식으로 회원가입을 했을 때의 요청 라인이다. 사용자가 입력한 값을 물음표 뒤에 key=value&key=value 형식으로 전송한다. 요청 URI는 "/user/create" 이고, 물음표 뒤에 전달되는 매개변수는 쿼리스트링이라고 부른다.

 

전체 코드

public void run() {
    log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(),
            connection.getPort());

    try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) {

        BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
        String line = br.readLine();
        log.debug("Request Line : {}", line);

        String[] tokens = line.split(" ");

        while( (line = br.readLine()) != null ) {
            if( line.equals("")) {
                break;
            }
        }
        String[] uri = tokens[1].split("\\?");
        log.debug("requestURL : {} ",line);
        String requestPath = uri[0];
        String parameters = uri[1];

        Map<String, String> parameterMap = HttpRequestUtils.parseQueryString(parameters);

        User user = new User( 
                parameterMap.get("userId"), 
                parameterMap.get("password"), 
                parameterMap.get("name"), 
                parameterMap.get("email") );

        log.debug("User Model : {}", user.toString());

        DataOutputStream dos = new DataOutputStream(out);

        byte[] body = Files.readAllBytes(Paths.get("./webapp" + requestPath));

        response200Header(dos, body.length);
        responseBody(dos, body);
    } catch (IOException e) {
        log.error(e.getMessage());
    }
}

 

 

GET 방식의 문제점

대표적으로 사용자가 입력한 데이터가 브라우저 URI 입력창에 표시된다. 회원가입을 하는 경우 비밀번호까지 URI에 노출되기 때문에 보안 측면에서도 좋지 않다. 또한, 요청 라인의 길이에 제한이 있다. 즉, GET 방식으로 사용자가 입력할 수 있는 데이터 크기에도 제한이 있다.

따라서, GET 방식은 회원가입, 블로그 글쓰기, 질문하기 등과 같이 사용자가 입력한 데이터를 서버에 전송해 추가할 때는 적합하지 않다. 이에 HTTP는 POST 방식을 지원한다.

댓글