🍁Auth
Authentication (인증)
- 로그인(Sign in), 로그아웃(Sign out)
인증은 현재 접속자가 해당 사이트의 구성원인지 확인하는 작업이다.
해당 접속자가 구성원인지를 확인하는 작업(아이디, 암호)을 한다. 그리고 구성원인지 아닌지에 대한 인증 티켓을 발급하여 표시를 한다.
쉽게 말하자면 놀이동산을 자유롭게 들어갈 수 있는 팔찌가 있다면, 인증은 팔찌를 얻기까지의 과정이라고 할 수 있다.
Authorization (허가)
허가는 특정 행동을 할 때 권한이 있는지 확인하는 작업이다.
웹 보안
- 세션 기반 인증
- 쿠키 기반 인증
웹 보안은 인증과 허가를 합친 것을 의미한다.
파일
AuthTest > script.sql
WEB-INF > lib > ojdbc6.jar
com.test.auth > DBUtil.java
webapp
시작 페이지: index.jsp
webapp > auth
로그인 폼 페이지: login.jsp
로그인 처리 페이지(+인증 작업): loginok.jsp
로그아웃 처리 페이지: logoutok.jsp
webapp > member
회원 전용 페이지(+허가 작업): member.jsp
webapp > admin
관리자 전용 페이지(+허가 작업): admin.jsp
🍁DB
script.sql
--user 테이블
--해당 테이블에 걸려 있는 Constraint 확인
SELECT * FROM user_constraints WHERE table_name = 'TBLUSER';
DROP TABLE tblBoard;
DROP TABLE tblUser;
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:관리자)
);
SELECT * FROM tblUser;
INSERT INTO tblUser VALUES ('isaac', '1111', '아이작', '1');
INSERT INTO tblUser VALUES ('sopia', '1111', '소피아', '1');
INSERT INTO tblUser VALUES ('admin', '1111', '관리자', '2');
COMMIT;
SELECT * FROM tblUser WHERE id = 'aaa' AND pw = '1111';
SELECT * FROM tblUser WHERE id = 'isaac' AND pw = '1111';
🍁시작 페이지
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="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>인증/허가</h1>
<% if (session.getAttribute("auth") == null) {%>
<fieldset>
<input type="button" value="로그인" onclick="location.href='auth/login.jsp';">
</fieldset>
<% } else { %>
<fieldset>
<input type="button" value="로그아웃" onclick="location.href='auth/logoutok.jsp';">
<div class="message">
<div>아이디: <%= session.getAttribute("auth") %></div>
<div>이름: <%= session.getAttribute("name") %></div>
<div>등급: <%= session.getAttribute("lv").toString().equals("1") ? "일반회원" : "관리자" %></div>
</div>
</fieldset>
<% } %>
<hr>
<!-- 회원 전용 페이지(노출 유무) -->
<% if (session.getAttribute("auth") != null) { %>
<div><a href="member/member.jsp">회원 페이지</a></div>
<% } %>
<hr>
<!-- 회원 전용 페이지(기능 유무) -->
<% if (session.getAttribute("auth") != null) { %>
<div><a href="member/member.jsp">회원 페이지</a></div>
<% } else {%>
<div><a href="#!" onclick="alert('로그인한 회원만 접근 가능합니다.')">회원 페이지</a></div>
<% } %>
<!-- 관리자 전용 페이지 -->
<div><a href="admin/admin.jsp">관리자 페이지</a></div>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
🍁로그인 관련
로그인 폼 페이지
login.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="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>로그인</h1>
<form method="POST" action="loginok.jsp">
<table class="vertical">
<tr>
<th>아이디</th>
<td><input type="text" name="id" required></td>
</tr>
<tr>
<th>암호</th>
<td><input type="password" name="pw" required></td>
</tr>
</table>
<div>
<input type="submit" value="로그인">
</div>
</form>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
로그인 처리 페이지(+인증 작업)
loginok.jsp
<%@page import="com.test.auth.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"%>
<%
/*
loginok.jsp
1. 데이터 가져오기(id, pw)
2. DB 작업 > select
3.1 존재하면 인증 티켓 발급
3.2 존재하지 않으면 아무일 없음
4. 피드백
*/
//1.
String id = request.getParameter("id");
String pw = request.getParameter("pw");
//2.
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
try {
conn = DBUtil.open();
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()) {
System.out.println("로그인 성공");
//로그인 성공 > 인증 티켓 발견 > 세션 안에 로그인을 성공했다는 표시를 저장
//세션 > 전역 변수, 개인 공간
session.setAttribute("auth", id); //인증 티켓
//로그인 시 노출하고 싶은 개인정보도 같이 넣기
//최소한의 정보만 session에 넣기
session.setAttribute("name", rs.getString("name"));
session.setAttribute("lv",rs.getString("lv"));
response.sendRedirect("../index.jsp");
} else {
System.out.println("로그인 실패");
response.sendRedirect("login.jsp");
}
rs.close();
stat.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
로그인 후 반환하는 최대 레코드는 하나가 나오던가 0개가 나오던가 둘 중 하나이다.
이를 이용하여 로그인이 되었는지 안 되었는지를 확인할 수 있다.
로그아웃 처리 페이지
logoutok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
logoutok.jsp
1. 로그아웃 처리
2. 피드백
1.
- 인증 후 == 인증 티켓 소유
- 인증 전 == 인증 티켓 미소유
*/
session.removeAttribute("auth"); //로그아웃
response.sendRedirect("../index.jsp");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
🍁허가 작업
회원 전용 페이지(+허가 작업)
member.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//인증받지 못한 사용자가 직접 접근하면 내쫓기
if (session.getAttribute("auth") == null ) {
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("</head>");
out.println("<body>");
out.println("<script>");
out.println("alert('회원만 접근 가능합니다.')");
out.println("location.href = '../index.jsp';");
out.println("</script>");
out.println("</body>");
out.println("</html>");
out.close(); //더 이상 아래의 출력되는 코드 진행을 하지 않고 중단
//response.sendRedirect("../index.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>회원 전용 페이지</h1>
<p>이 페이지는 회원만 접근이 가능합니다.</p>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
관리자 전용 페이지(+허가 작업)
admin.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="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>관리자 페이지</h1>
<p>이 페이지는 관리자만 접근이 가능합니다.</p>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>