로그인이나 회원가입 기능의 경우 여러 정보를 입력하고 submit 버튼인 로그인 혹은 회원가입 버튼을 누르면 form태그 안에 데이터들이 모두다 이동을 합니다.
그런 서버에서 처리를 하는 과정을 알아보려고 합니다.
브라우저가 서버에 데이터를 보내는 경우가 많습니다.
로그인이나 회원가입 뿐만 아니라 설문지의 경우에도 이런것을 사용하는데요.
이런 Data를 요청할때 Request객체에 담아서 서버로 보내게 됩니다.
이렇게 데이터를 요청할때는 get방식과 post방식 두가지가 있는데 이 두가지를 알아보곘습니다.
form태그에 대표적인 속성으로 action과 method가 있습니다.
method속성을 get으로 해놓고 submit을 누르게 되면 user data가 doGet() 메서드가 받게됩니다.
만약 method속성을 생략했다면 default로 get방식을 선택하게 됩니다.
get방식은 데이터가 웹 브라우저 URL에 노출되어 웹 서버로 전송이 됩니다.
이러한 get방식으로 전달이 되게되면 url뒤에 ?가 붙게 되는데 ?뒤에 붙는것을 쿼리스트링(QueryString)이라고 합니다.
이런 쿼리스트링은 key=value형태로 전달이 되게 되는데 ?뒤에 데이터가 붙어서 URL에 노출이 되며 전송이 되어 보안에 취약하겠죠?
보안 뿐만 아니라 쿼리스트링으로 보낼수 있는 데이터는 한계가 있기 때문에 이 또한 단점이라고 할수 있습니다.
반대로 form태그의 method속성이 post로 되어있으면 doPost() 메서드가 받게됩니다.
post방식은 심플하게 날라가게 되는데 매핑정보만 나오고 데이터는 나오지 않습니다.
데이터가 HTTP Request에 포함되어 웹 서버로 전송이 되기 때문인데 get방식에 비해 보안이 강하겠죠?
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action="mSignUp" method="get">
name : <input type="text" name="m_name"> </br>
password : <input type="password" name="m_pass"></br>
gender : Man<input type="radio" name="m_gender" value="M" checked="checked">, Woman<input type="radio" name="m_gender" value="W"></br>
hobby : Sport<input type="checkbox" name="m_hobby" value="sport">,
Cooking<input type="checkbox" name="m_hobby" value="cooking">,
Reading<input type="checkbox" name="m_hobby" value="reading">,
Travel<input type="checkbox" name="m_hobby" value="travel"></br>
residence : <select name="m_residence">
<option value="seoul" selected="selected">Seoul</option>
<option value="gyeonggi">Gyeonggi</option>
<option value="chungcheong">Chungcheong</option>
<option value="jeonra">Jeonra</option>
<option value="jeju">Jeju</option>
<option value="gyeongsang">Gyeongsang</option>
<option value="gangwon">Gangwon</option>
</select></br>
<input type="submit" value="sign up">
</form>
</body>
</html>
정보를 입력하여 전송하는 코드를 간단하게 작성해보았습니다.
package com.servlet;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/mSignUp")
public class MemSignUp extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(" -- doGet() -- ");
String m_name = request.getParameter("m_name");
String m_pass = request.getParameter("m_pass");
String m_gender = request.getParameter("m_gender");
String[] m_hobbys = request.getParameterValues("m_hobby");
String m_residence = request.getParameter("m_residence");
System.out.println("m_name : " + m_name);
System.out.println("m_pass : " + m_pass);
System.out.println("m_gender : " + m_gender);
System.out.println("m_hobbys : " + Arrays.toString(m_hobbys));
System.out.println("m_residence : " + m_residence);
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
System.out.println("name : " + name);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(" -- doPost() -- ");
doGet(request, response);
}
}
ㄷㅅ이 코드는 서블릿에서 어떻게 처리가 되는지를 보여주는데요.
이 파일을 한번 실행시켜 로그를 보겠습니다.
위의 방식은 get방식이기 때문에 쿼리스트링으로 데이터가 전달이 됩니다.
서버에서 보면 데이터가 잘 전달이 되었죠?
그런데 요청한 데이터를 받을때 getParameter메서드를 사용했는데 취미의 경우 여러개가 들어올수 있기때문에 getParameterValues메서드를 사용했습니다.
또 위의 코드에서는 getParameterNames메서드는 만약 어딘가 데이터가 잘못들어왔을 경우 어디서 잘못들어오는 경우를 알기위해서 이름을 찍어보는 경우입니다.
이번에는 post 방식으로 전달을 해보았습니다.
URL의 뒤에 쿼리스트링이 없는것을 확인할수 있습니다.
또 로그를 보니 doPost메서드로 먼저 들어오게되는것을 볼수있죠!
데이터도 잘 전달이 되었네요.
이 글은 실전 JSP (renew ver.) - 신입 프로그래머를 위한 강좌를 수강하며 공부한 내용을 정리한 글입니다.
https://www.inflearn.com/course/실전-jsp_renew/dashboard
'Java 관련 > JSP & Servlet' 카테고리의 다른 글
[JSP & Servlet] request객체, response객체 (0) | 2022.08.16 |
---|---|
[JSP & Servlet] JSP 스크립트<%! %>, 스크립트릿<% %>, 주석 <%-- --%> (0) | 2022.08.14 |
[JSP & Servlet] Servlet Life-Cycle과 메서드 (0) | 2022.08.12 |
[JSP & Servlet] request(요청), response(응답) (0) | 2022.08.11 |
[JSP & Servlet] Servlet 맵핑 (0) | 2022.08.10 |