본문 바로가기
Lecture/JSP & Java

[본격 웹보안 Part 1.1] 웹 해킹도 로그인부터

by cusmaker 2012. 9. 19.
반응형

안녕하세요 cocy입니다.


이번시간에는 웹에서 기본적으로 다루는 웹 보안에 대해 알아보도록 하겠습니다.

보안을 하시려면 만들어봐야 왜 뚫리는지 이해가 빠르시겠죠?

본격 게시판 part 1을 진행하고 오시기 바랍니다.

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.1 - 게시판도 HTML부터] 게시글 리스트

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.2 - 게시판도 HTML부터] 글입력폼

2012/06/13 - [Lecture/Javascript-기초] - [본격 게시판짜기 Part1.3 - Dom 맛보기 ] 글입력폼 검사

2012/06/13 - [Lecture/Jsp] - [본격 게시판짜기 Part1.4 - HTML-> JSP] form 파라미터 받기

2012/06/26 - [Lecture/SQL / Oracle] - [본격 게시판짜기 Part1.5 JSP > Oracle] 게시판 DB 테이블 생성

2012/06/26 - [Lecture/Jsp] - [본격 게시판짜기 Part1.6 Oracle > JSP] Database 접속 및 Select

2012/07/05 - [Lecture/Jsp] - [본격 게시판짜기 Part1.7 JSP, SQLDeveloper] 게시글 입력 및 리스트조회기능

2012/07/08 - [Lecture/Jsp] - [본격 게시판짜기 Part1.8 JSP 게시글 조회] 게시글 조회기능 및 게시글 삭제


그럼 시작합니다.


우선 로그인화면을 구성하기 위해 회원테이블을 만듭니다.

회원테이블은 간단하게 다음과 같이 구성합시다.

테이블명은 member, 컬럼은 name, user_id, user_pw 네 개입니다.



테이블의 생성이 끝났으면 시퀀스도 생성해 주시구요



다음은 본격적으로 소스를 추가하기위해 패키지를 생성하고 entity bean을 생성합니다.

본 강의에서는 게시판 소스에 추가를 하겠습니다.

bean의 이름은 Member로 하겠습니다.




index.jsp 파일을 생성합니다. 그리고 다음 내용을 입력합니다.

(본격 게시판 part1을 진행하셨다는 가정하에 세세한 소스설명은 생략하겠습니다.)

<!-- index.jsp -->

<html>

<head>

</head>

<body>

<form action="login.jsp">

ID : <input type="text" name="id" /> <br/>

PW: <input type="password" name="pw" /> <br/>

<input type="submit" value="로그인" />

<input type="button" value="회원가입" onclick="location.href='enter.jsp';" />

</form>

</body>

</html>

로그인폼을 작성하였습니다.

기존의 게시판소스에 적용을 하고 싶으신 분들은 index.jsp안의 내용을 지우시고 작성하시면 됩니다.


그럼 이제 id와 pw를 받아서 로그인 처리를 하는 login.jsp페이지를 작성합니다.

여기서 잠깐 생각을 해보자면 로그인 처리는 어떤식으로 이루어 지면 될까요?

가장 기본적으로 생각해 보면 


index.jsp로부터 넘어온 아이디와 패스워드를 가지고 

login.jsp에서 데이터베이스로 해당 아이디와 패스워드에 매치되는 데이터를 가져옵니다.

그리고 나서 세션* 처리를 통해 웹페이지가 살아 있는 동안 로그인 처리를 유지해 줍니다.

<!-- login.jsp -->

<%@ page language="java" contentType="text/html; charset=EUC-KR"    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.board.bean.Member" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


<%

String user_id = request.getParameter("id");

String user_pw = request.getParameter("pw");

Member user = null;

try {

String driverName = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:XE";

ResultSet rs = null;

Class.forName(driverName);

Connection con = DriverManager.getConnection(url,"board","board");

Statement stmt = con.createStatement();


String sql = "select * from member where user_id = '" + user_id + "' and user_pw = '" + user_pw +"'";

rs = stmt.executeQuery(sql);

if(rs.next()){

user = new Member();

user.setUser_id(rs.getString("user_id"));

user.setUser_pw(rs.getString("user_pw"));

}

}catch(Exception e){

out.println("error!");

}finally{

if(user == null){

request.setAttribute("msg", "there is no member Infomation");

request.setAttribute("url", "index.jsp");

}else{

request.setAttribute("msg", "welcome!");

request.setAttribute("url", "list.do");

request.getSession().setAttribute("user", user_id); 

}

}

%>

<script>

alert("${msg} "+ " ${user}");

location.href="${url}";

</script>


enter.jsp 파일을 생성합니다. 회원가입 페이지입니다.

<!-- enter.jsp -->

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title></title>

</head>

<body>

<form action="join.jsp" method="post">

name : <input type="text" name="name" /><br/>

id : <input type="text" name="user_id" /><br/>

pw : <input type="text" name="user_pw" /><br/>

<input type="submit"/>

</form>

</body> 

</html>   

그 다음은 가입폼에서 받은 데이터를 데이터베이스에 넣는 join.jsp 페이지입니다.

insert.jsp페이지와 유사하며 회원가입이 이루어지면 로그인 페이지(index.jsp)로 이동합니다.

<!-- join.jsp -->

<%@page import="java.util.regex.Pattern"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<%

request.setCharacterEncoding("euc-kr");

String name = request.getParameter("name");

String user_id = request.getParameter("user_id");

String user_pw = request.getParameter("user_pw");

try {

String driverName = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:XE";

 

Class.forName(driverName);

Connection con = DriverManager.getConnection(url,"board","board");

out.println("Oracle Database Connection Success.");

 

Statement stmt = con.createStatement();

String sql = "INSERT INTO MEMBER "+

"(IDX, NAME, USER_ID, USER_PW) "+ 

"VALUES (member_seq.nextval, '"+name+"', '"+user_id+"', '"+user_pw+"')";

stmt.executeUpdate(sql);

 

con.close();

}catch (Exception e) {

out.println(e.getMessage());

e.printStackTrace();

}finally{

request.setAttribute("url", "index.jsp");

}

%>

<script>

location.href='${url}';

</script>

<body>

</body>

</html>


잘 작동하는지 확인 해 보시기 바랍니다.


이상으로 아주 심플한 회원가입과 로그인기능이 완성되었습니다.

보안의 중요성을 위해 만든 구성인 만큼 완성도는 낮습니다.

그럼 다음시간에는 이를 이용하여 지금까지 만들어진 기능의 허점은 무엇이고,

어떤 문제점이 있는지 파악해 보면서 웹 해킹 공격 유형별로 알아보도록 하겠습니다.


수고하셨습니다.

다음글 : sql injection >> http://cusmaker.tistory.com/124