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 일지
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

인기 글

태그

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

최근 댓글

최근 글

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 + /
⇧ + /

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