JSP 강의평가 웹페이지 만들기
강의평가 웹페이지, 게시판, 소개페이지 구현 동영상
프로젝트를 진행하며..
JSP와 톰캣을 사용하여 강의평가 웹페이지, 게시판, 파일업로드 등을 구현하였습니다.
게시판, 파일업로드 또한 각각 따로 만들기 강의가 있었지만
페이지를 따로 만들지 않고 이미 만들어진 페이지에 추가하는 방법으로
페이지를 구성하였습니다.
이번 프로젝트를 통하여 실제 웹 페이지를 구현하는데 있어서
이런식으로 보여지는구나 하는 전체적인 그림이 머리속에 정리되기도 하였고
또한, 백엔드 개발자라면 보안과 밀접한 관련이 있다는것에 흥미를 가지게 되었습니다.
로그인 세션, 데이터를 효과적으로 주고받을 수 있는 DAO, DTO구조, 순수 JDBC를 활용하여 DB와 연동하는 방법,
톰캣 서버연결 등 처음보는 작업들에 대하여 간단하게 이해할 수 있게되었고
JAVA 버전 및 라이브러리, 톰캣 등의 버전이 서로 연동이 잘 되어야 하는게 중요하다는 점을 알게되었습니다.
실제로 해당 프로젝트를 처음 시작하면서 버전간의 호환성이 맞지 않아서 3일을 허비하게 되었습니다.
수많은 검색과 재설치 작업의 반복을 통해서 해결하였습니다.
개발을 막바지에 들어서면서 동시에 Spring framework에 대하여 공부를 시작하였는데
해당 프로젝트는 옛날 방식이라는 점과 객체지향적인 관점에서 보았을 때 많은점이 부족해 보였고
이미 만들어진 프로젝트를 마음대로 수정하려다 보니 손볼곳이 많고(Enumeration 등을 사용함, 현재는 Iterator 사용
페이지 네이션 기능 등을 간단하게 구성됨 등)
수정을 하며 작업을 하다보니 DB에 대한 이해도 및 실제 코딩능력이 부족하다고 느꼈습니다.
또한 현재는 해당 프로젝트와 같은 방식으로 작업하는 것이 아닌 스프링 프레임워크를 이용하여 만들기 때문에
(객체지향적인 설계, 실제 실무에서 사용되는 코딩 등을 활용)
더이상의 프로젝트 작업은 중단하고 JAVA 객체지향, 스프링 프레임워크에 대한 공부와
JAVA8에서 추가된 람다, 스트림, 옵셔널 등에 대하여 공부하는것이 더 효율적이라 생각하였기 때문에
마지막에 개인적으로 추가해볼 기능들을 추가하지 않고 잠정 중단하기로 하였습니다
프로젝트를 중단 하였다고 해서 해당 프로젝트가 전혀 저에게 도움이되지 않았다고 하는건 아닙니다.
개인적인 생각일 뿐이지만 혹시나 동빈나 JSP 강의평가 웹페이지 강의를 보고 웹 페이지를 만들고자 하는분들이 있고
후에 Spring을 학습할 예정이신 분들이라면 한번쯤 만들어 보는것을 추천드립니다.
Spring을 학습하기전에 해당 페이지를 구현해본다면 스프링을 이해하는데 도움이 될것이라 생각합니다.
스프링 공부전 읽어보면 좋을 도서 - 스프링 입문을 위한 자바 객체 지향의 원리와 이해
해당 책을 읽으며 스택, 힙 영역에 대한 이해도가 높아지게 되었고
JAVA의 객체지향 4대특성 및 SOLID에 대한 전체적인 그림이 그려지게 되었습니다.
참고로 Spring 공부에 대해서는 시간이 많이 부족하다고 생각했기 때문에
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 개발자가 되어보세요! 📣 확인해주
www.inflearn.com
인프런 스프링 강의로 유명한 김영한님의 강의 전체 커리큘럼을 대체하여 듣고있습니다.
보안관련
해당 프로젝트에는 다양한 기술들을 사용하거나 보안관련 라이브러리를 사용하지는 않았지만
간단하게 보안코딩을 작성했습니다.
크로스 사이드 스크립팅(XXS) - 특정한 사용자가 다른 사용자와 통신하는 과정에서 발생할 수 있는 해킹기술
게시판 글 혹은 댓글 등의 기능에서 <script></script> 스크립트 구문을 활용하여 XXS 공격이 가능하다는 것을
알게되었고 이를 방지하는 다양한 라이브러리들이 있다는것도 알게되었습니다.
대표적인 공격사례 -
<script>
location.href = 'https://www.피싱사이트 주소.com';
</script>
현재 페이지와 흡사한 형태로 피싱사이트를 만들고 해당 사이트로 연결시키는 방법으로
실제로 사용자의 개인정보를 탈취할 수 있다.
보안코딩
bbs.getBbsTitle().replaceAll(" ", " ").replaceAll("<", "<").
replaceAll(">", ">").replaceAll("\n", "<br/>")
공백, 꺽새, 줄바꾸기 등을 HTML언어로 치환되게 코딩되어 있습니다.
웹쉘 업로드 취약점 - 파일 업로드 취약점으로 대표적인 것 web shell CMD창, 명령프롬포트를 일종의 shell이라고 할수있는데 어떠한 서버든 쉘이 존재한다. 만약 사용자가 Shell에 접근가능하다면 cmd상의 명령어를 사용할 수 있다.
때문에 반드시 막아야한다.
ex) 파일 업로드 시 jsp파일을 업로드 한다. 그다음 jsp를 실행시켜버린다.
ASP, JSP, PHP 모든 유형에서 적용이 가능한 기법입니다.
공격자는 웹 쉘을 통해 서버의 명령어를 직접 실행시키게 됩니다
보안코딩
public int upload(String fileName, String fileRealName) { // 업로드
String SQL = "INSERT INTO FILE VALUES (?, ?, 0)";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// DB접근하는 함수는 DatabaseUtil 외부 util에 정의를 함으로써 안정적으로 모듈화 함
conn = DatabaseUtil.getConnection(); // DB와 연결
pstmt = conn.prepareStatement(SQL); // SQL실행 문자로 준비시킴
pstmt.setString(1, fileName);
pstmt.setString(2, fileRealName);
return pstmt.executeUpdate(); // DB실행문을 실행시킨 결과를 담음
// 정상적인 수행결과는 1을 반환한다.
} catch (Exception e) {
e.printStackTrace();
} finally {
// Connection, PreparedStatement, ResultSet은 한번 사용이 되고나면 자원을 해제하여야 한다.
// 서버에 무리가 가지 않도록 하기위해서
try { if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); }
try { if (pstmt != null) pstmt.close(); } catch (Exception e) { e.printStackTrace(); }
try { if (rs != null) rs.close(); } catch (Exception e) { e.printStackTrace(); }
}
return -1; // 데이터베이스 오류
}
if (!fileName.endsWith(".doc") && !fileName.endsWith(".hwp") && !fileName.endsWith(".pdf") &&
!fileName.endsWith(".xls") && !fileName.endsWith(".txt")) {
// 위의 다섯가지 확장자만 업로드 할수있도록 만들어줌
File file = new File(directory + fileRealName);
file.delete(); // 올바른 확장자가 아니라면 지워버린다
out.write("업로드할 수 없는 확장자입니다.");
} else {
new FileDAO().upload(fileName, fileRealName);
// 실제로 업로드를 수행할 수 있도록 만듬
out.write("파일명: " + fileName + "<br />");
out.write("실제 파일명: " + fileRealName + "<br />");
}
endsWith()메소드를 사용하여 지정된 확장자의 파일들만 업로드되게 만들어주었지만 취약점이 존재한다.
일단 업로드가된 뒤에 나중에 삭제하기 때문에 일종의 레이스 컨디션(Race Condition)취약점이 발생한다
만약 업로드와 업로드된 파일에 계속 반복하여 접속하는 프로그램이 있다면 경쟁상태에 빠지게된다.
하나의 스레드는 계속해서 업로드하고 다른 하나의 스레드는 계속 지우려고 하기 때문에 한번쯤은 실행되게 되어있다.
레이스 컨디션(Race Condition) 경쟁상태를 유발함으로서 한번이라도 해당파일을 실행하도록 만들어서 웹쉘 기능을 수행하게 할 수 있다. 이를 원천적으로 봉쇄하는 방법은 파일의 루트 디렉터리 밖에 업로드 폴더를 위치시키는 것입니다.
본래 프로젝트 폴더 내부에 upload폴더가 존재하였지만 C드라이브로 경로를 바꿈
참조 : 동빈나 유튜브
https://www.youtube.com/channel/UChflhu32f5EUHlY7_SetNWw
깃허브 링크 :