사용자의 비밀번호를 그대로 DB에 저장하게 되면 위법사항에 국한될 수 있음으로 사용자가 저장한 비밀번호를 암호화를 진행하고 Database에 저장해야함
암호화를 하기 위해 Spring Security Web이라는 모듈을 통해 암호화 진행할 수 있음
암호화를 진행하고 싶은 메서드에 BCryptPasswordEncoder객체를 이용하여 암호화 진행
@Override
public void regist(UserVO user) {
// 회원의 비밀번호를 암호화 인코딩하는 로직
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
System.out.println("암호화 하기 전 PW : " + user.getPassword());
// 사용자에게 입력받은 비밀번호를 암호화해서 user객체에 다시 저장
String securePw = encoder.encode(user.getPassword());
System.out.println("암호화 후 PW : " + securePw);
user.setPassword(securePw);
// 암호화한 비밀번호를 다시 세팅
mapper.regist(user);
}
로그인을 할 때 사용자가 입력한 비밀번호와 DB에 암호화된 비밀번호가 같은지 확인하기 위해 BCryptPasswordEncode객체의 matches함수(사용자 입력값, DB에 저장된 암호화값) 활용
// 로그인 요청 처리
@PostMapping("/loginCheck")
public String loginCheck(@RequestBody UserVO user) {
System.out.println("/user/loginCheck : POST");
UserVO dbData = service.selectOne(user.getAccount());
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
// 암호화된 비밀번호를 가져오기 위해
if (dbData != null) {
if (encoder.matches(user.getPassword(), dbData.getPassword())) {
// 사용자가 입력한 비밀번호를 암호화 했을 때 기존에 저장된 암호화된 비밀번호가 같은지
return "loginSuccess";
} else {
return "pwFail";
}
} else {
return "idFail";
}
}
HTTP 프로토콜은 클라이언트가 요청을 보내고 서버가 응답을 하게 되면 관계를 끊어버리는 특징이 존재
관계가 끊어져도 지속적으로 정보를 가지고 있을 수 있는 수단으로 세션과 쿠키를 사용
HttpServletRequest 객체 사용
HttpSession 객체 사용
Code
// 로그인 요청 처리
@PostMapping("/loginCheck")
public String loginCheck(@RequestBody UserVO user, /* 1번 방법 HttpServletRequest request*/
HttpSession session) {
System.out.println("/user/loginCheck : POST");
// 서버에서 세션 객체를 얻는 방법
// 1. HttpServletRequest 객체 사용 (메서드의 매개변수로 넣어줌)
// HttpSession session = request.getSession();
// 2. 매개값으로 HttpSession 객체 받아서 사용 특정 메서드에 sesion정보 입력
// 오버라이딩을 할 경우 매개변수를 마음대로 바꾸지 못해서 2번은 문제가 발생할 수 있음
UserVO dbData = service.selectOne(user.getAccount());
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
// 암호화된 비밀번호를 가져오기 위해
if (dbData != null) {
if (encoder.matches(user.getPassword(), dbData.getPassword())) {
// 사용자가 입력한 비밀번호를 암호화 했을 때 기존에 저장된 암호화된 비밀번호가 같은지
// 로그인을 성공했다면 로그인 성공 대상으로 세션 정보 생성
session.setAttribute("login", dbData);
return "loginSuccess";
} else {
return "pwFail";
}
} else {
return "idFail";
}
}
session을 활용하여 로그인한 사용자만 게시판 수정 삭제 기능이 보일 수 있도록 구현
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:include page="../include/header.jsp" />
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<style>
header.masthead {
display: none;
}
</style>
<br />
<br />
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header text-white"
style="background-color: #643691;">${article.boardNo }번게시물 내용</div>
<div class="card-body">
<div class="form-group">
<label>작성자</label> <input type="text" class="form-control"
name='writer' value="${article.writer }" readonly>
</div>
<div class="form-group">
<label>제목</label> <input type="text" class="form-control"
name='title' value="${article.title }" readonly>
</div>
<div class="form-group">
<label>내용</label>
<textarea class="form-control" rows="5" name='content' readonly>${article.content }</textarea>
</div>
<form id="formObj" role="form"
action="<c:url value='/board/delete' />" method="post">
<input type="hidden" name="boardNo" value="${article.boardNo}">
<input id="list-btn" class="btn" type="button" value="목록"
style="background-color: #643691; margin-top: 0; height: 40px; color: white; border: 0px solid #388E3C; opacity: 0.8">
<c:if test="${login.name == article.writer }">
<!-- session으로 저장된 유저의 정보와 해당 글의 작성 유저의 정보가 일치하면 수정, 삭제 보이는 로직 -->
<input id="mod-btn" class="btn" type="button" value="수정"
style="background-color: orange; margin-top: 0; height: 40px; color: white; border: 0px solid #388E3C; opacity: 0.8">
<input class="btn" type="submit" value="삭제"
onclick="return confirm('정말로 삭제하시겠습니까?')"
style="background-color: red; margin-top: 0; height: 40px; color: white; border: 0px solid #388E3C; opacity: 0.8">
</c:if>
</form>
</div>
</div>
</div>
</div>
</div>
<jsp:include page="../include/footer.jsp" />
<script>
/* // 리스트 이동
const $listBtn = document.getElementById('list-btn');
$listBtn.onclick = function() {
console.log('목록 번튼 클릭');
location.href = '/board/list';
}
// 수정
const $modBtn = document.getElementById('mod-btn');
const $formElement = document.getElementById('formObj');
$modBtn.onclick = function () {
$formElement.setAttribute('action', '/board/modify');
$formElement.setAttribute('method', 'get');
$formElement.submit();
} */
// 제이쿼리 시작
$(document).ready(function() {
// 목록 버튼 클릭 이벤트
$('#list-btn').click(function() {
console.log('목록 버튼이 클릭');
location.href ='/board/list?page=${p.page}&cpp=${p.cpp}&condition=${p.condition}&keyword=${p.keyword}';
// controller가 보내준 model 객체인 p의 값을 가져옴
});
// 수정 버튼 클릭 이벤트
$('#mod-btn').click(function() {
$('#formObj').attr({
'action' : '/board/modify',
'method' : 'get'
});
$('#formObj').submit();
})
})
</script>