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)
- 인증 티켓 발급(*****) > 세션!! or 쿠키
- 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 |