Server

JSP STEP 9 - Web Security

2023. 5. 10. 17:44
728x90

★ 웹보안, Web Security

  • 로그인, 로그아웃
  • 세션(쿠키) 기반의 인증
  • 현재 접속자가 해당 사이트의 구성원인지 확인하고, 특정 행동에 대한 허가를 하는 작업

■ 1. 인증, Authentication

  • 현재 접속자가 해당 사이트의 구성원인지 확인
  • 회원?
  • 로그인

■ 2. 허가, Authorization

  • 특정 행동에 대한 허가를 하는 작업

★ 데이터 베이스 생성

  • Oracle 사용
  • 데이터베이스 DDL
create table tblUser (
    id varchar2(30) primary key,        -- 아이디(PK)
    pw varchar2(30) not null,           -- 암호
    name varchar2(30) not null,        -- 이름
    lv number(1) not null                -- 등급(1-일반, 2-관리자)
);

-- 일반 회원
insert into tblUser values ('hong', '1111', '이민지', 1);
insert into tblUser values ('test', '1111', '이동재', 1);

-- 관리자 회원
insert into tblUser values ('admin', '1111', '김대환', 2);

 

★  파일 생성

- webapp > "auth" 폴더 생성
			> "index.jsp" 	: 시작 페이지(초기화면)
			> "login.jsp"	: 로그인 폼 페이지
			> "loginok.jsp"	: 로그인 처리 페이지 > 실제 인증 작업 수행
			> "logout.jsp"	: 로그아웃 페이지
			
			> "member.jsp"	: 회원 전용 페이지 > 허가 작업	
			> "admin.jsp"	: 관리자 전용 페이지 > 허가 작업

 

■ index.jsp : 시작 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>
	<!-- index.jsp -->
	
	<h1>시작 페이지</h1>
	
	<% if (session.getAttribute("id") == null) { %>
	<a href="login.jsp">로그인</a>
	<% } else { %>
	<a href="logout.jsp">로그아웃</a>
	
	<div class="panel">
		<div>아이디 : <%= session.getAttribute("id") %></div>
		<div>이름 : <%= session.getAttribute("name") %></div>
		<div>등급 : <%= session.getAttribute("lv").toString().equals("1") ? "일반 회원" : "관리자" %></div>
	</div>
	
	<% } %>
	
	<hr>
	
	<% if (session.getAttribute("id") != null && session.getAttribute("lv").toString().equals("2")) { %>
	<a href="admin.jsp">관리자 전용 페이지</a>
	<% } %>
	
	<!-- 노출 제어 -->
<%-- 	<% if (session.getAttribute("id") != null) { %> --%>
<!-- 	<a href="member.jsp">회원 전용 페이지</a> -->
<%-- 	<% } %> --%>
	
	<!-- 행동 제어 -->
	<% if (session.getAttribute("id") != null) { %>
	<a href="member.jsp">회원 전용 페이지</a>
	<% } else { %>
	<a href="#!" onclick="alert('회원 전용 페이지입니다. 로그인을 하세요.'); location.href='login.jsp';">회원 전용 페이지</a>
	<% } %>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
</script>
</body>
</html>

 

■ login.jsp : 로그인 UI 파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>

	<!-- login.jsp -->
	
	<h1>로그인</h1>
	
	<form method="POST" action="loginok.jsp">
	<table>
		<tr>
			<th>아이디</th>
			<td><input type="text" name="id" required class="short"></td>
		</tr>
		<tr>
			<th>비밀번호</th>
			<td><input type="password" name="pw" required class="short"></td>
		</tr>
	</table>
	
	<div>
		<input type="button" value="돌아가기" onclick="location.href='index.jsp';">
		<input type="submit" value="로그인">
	</div>
	</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
</script>
</body>
</html>

 

■ loginok.jsp : 로그인을 처리하는 DB 파일

  • 1. 데이터 가져오기(id, pw)
  • 2. DB 작업 > select
  • 3. 확인 결과
  • 3.1 확인 O > ??
    • 인증 티켓 발급(*****) > 세션!! or 쿠키  
      • 개인적(다른 유저의 티켓과는 독립적으로 관리가 가능)
      • 이동 자유(a.jsp > b.jsp)
  • 3.2 확인 X > 쫒아내기
<%@page import="com.test.my.DBUtil"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

	//1. 데이터 가져오기(id, pw)
	//2. DB 작업 > select
	//3. 확인 결과
	// 3.1 확인 O > ??
	//	- 인증 티켓 발급(*****) > 세션!! or 쿠키
	//		- 개인적(다른 유저의 티켓과는 독립적으로 관리가 가능)
	//		- 이동 자유(a.jsp > b.jsp)
	// 3.2 확인 X > 쫒아내기
	
	//1. 
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	
	//2. 
	Connection conn = null;
	PreparedStatement stat = null;
	ResultSet rs = null;
	
	conn = DBUtil.open();
	
	//로그인 SQL
	String sql = "select * from tblUser where id = ? and pw = ?";
	
	stat = conn.prepareStatement(sql);
	
	stat.setString(1, id);
	stat.setString(2, pw);
	
	rs = stat.executeQuery();
	
	//로그인 성공 유무 확인
	if (rs.next()) {
		//로그인 성공
		//인증 티켓 발급
// 		session.setAttribute("num", 100); //여기서만!!
		session.setAttribute("id", id); //인증 티켓 > 식별자 저장
		
		//로그인 회원의 부가 정보
		session.setAttribute("name", rs.getString("name"));
		session.setAttribute("lv", rs.getString("lv"));
		
		
		
	} else {
		//로그인 실패
		
	}
	
	rs.close();
	stat.close();
	conn.close();
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>



<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

	<% if(session.getAttribute("id") != null) { %>
		
		location.href = 'index.jsp';
	
	<% } else { %>
	
		alert('로그인 실패;;');
		history.back();
	
	<% } %>

</script>
</body>
</html>

 

■ logout.jsp : 로그아웃 시키는 파일

  • 로그아웃 > 인증 티켓 제거
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

	//로그아웃 > 인증 티켓 제거
	session.removeAttribute("id");
	session.removeAttribute("name");
	session.removeAttribute("lv");
	
	response.sendRedirect("index.jsp");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>

	<h1>로그아웃</h1>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
</script>
</body>
</html>

 

■ member.jsp : 회원 전용 페이지

  • 로그인에 성공한 회원만 볼 수 있는 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

	//페이지 열람 권한 확인? > 로그인?
	if (session.getAttribute("id")==null) {
		
		//미인증 유저!!
		//렌더링을 중단하고 출력 버퍼안에 내용을 클라이언트에게 반환한다.
		
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF=8'>");
		out.println("</head>");
		out.println("<body>");
		out.println("<script>alert('회원만 접근이 가능합니다.'); location.href='index.jsp';</script>");
		out.println("</body>");
		out.println("</html>");
		
		out.close(); 
		
	}

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>

	<h1>회원 전용 페이지</h1>
	
	<p>이 페이지는 회원만 열람이 가능합니다.</p>
	
	<a href="index.jsp">시작 페이지로 돌아가기</a>



<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
</script>
</body>
</html>

 

■ admin.jsp : 관리자 전용 페이지

  • 관리자만 접근이 가능한 페이지
  • 로그인한 사용자라도, 관리자 권한이 없으면 접근이 불가능.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

	if (session.getAttribute("id")==null
				|| !session.getAttribute("lv").toString().equals("2")) {
	
	//미인증 유저!!
	//렌더링을 중단하고 출력 버퍼안에 내용을 클라이언트에게 반환한다.
	
	out.println("<html>");
	out.println("<head>");
	out.println("<meta charset='UTF=8'>");
	out.println("</head>");
	out.println("<body>");
	out.println("<script>alert('관리자만 접근이 가능합니다.'); location.href='index.jsp';</script>");
	out.println("</body>");
	out.println("</html>");
	
	out.close(); 
	
}

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>

	<h1>관리자 전용 페이지</h1>
	
	<p>관리자만 접근이 가능합니다.</p>
	<p>로그인한 사용자라도, 관리자 권한이 없으면 접근이 불가능합니다.</p>

	<a href="index.jsp">시작 페이지로 돌아가기</a>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
</script>
</body>
</html>

 

★ 실행 결과

  • 1. 시작 페이지

  • 2. 로그인

  • 3. 로그인 성공

  • 4. 회원 전용 페이지
    • 회원만 클릭 시, 이동
    • 비회원은 alert 출력 후, 로그인 화면으로 이동

  • 5. 관리자 전용 페이지
    • 관리자만 클릭 시, 이동
    • 비회원, 일반회원은 alert 출력 후, 로그인 화면으로 이동

728x90
저작자표시 비영리 변경금지 (새창열림)

'Server' 카테고리의 다른 글

JSP STEP 11 - JSP Model 2 + EL + JSTL  (0) 2023.05.11
JSP STEP 10 - JSP Model  (2) 2023.05.11
JSP STEP 8 - DB를 연동하여, 주소록 사이트 만들기  (2) 2023.05.10
JSP STEP 7 - COOKIE  (2) 2023.05.10
JSP STEP 6 - Application  (0) 2023.05.09
'Server' 카테고리의 다른 글
  • JSP STEP 11 - JSP Model 2 + EL + JSTL
  • JSP STEP 10 - JSP Model
  • JSP STEP 8 - DB를 연동하여, 주소록 사이트 만들기
  • JSP STEP 7 - COOKIE
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • DB
  • React
  • 알고리즘
  • 코딩테스트
  • html
  • 개발자
  • 웹개발자
  • 데이터베이스
  • 앱개발자
  • 백준
  • java
  • ajax
  • JavaScript
  • jquery
  • 정보보안전문가
  • IT자격증
  • 자바
  • IT개발자
  • jsp
  • IT자격증공부
  • css
  • 웹페이지
  • 개발블로그
  • 정보처리기사
  • 정보처리기사필기
  • 웹개발
  • 백엔드
  • it
  • 프론트엔드
  • DBA

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
JSP STEP 9 - Web Security
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.