Session과 암호화

Let's Just Go·2022년 7월 23일
0

Spring

목록 보기
13/26

Spring

암호화

  • 암호화 기능
    • 사용자의 비밀번호를 그대로 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";
      		}
      	}

Session

  • Session
    • HTTP 프로토콜은 클라이언트가 요청을 보내고 서버가 응답을 하게 되면 관계를 끊어버리는 특징이 존재

    • 관계가 끊어져도 지속적으로 정보를 가지고 있을 수 있는 수단으로 세션과 쿠키를 사용

    • HttpServletRequest 객체 사용

      • 기존의 JSP에서 사용한 방법 그대로 사용
      • getSession()으로 세션을 얻음
    • HttpSession 객체 사용

      • 파라미터로 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 활용

  • session을 활용하여 로그인한 사용자만 게시판 수정 삭제 기능이 보일 수 있도록 구현

    • 저장한 session의 유저정보와 해당 글의 유저 정보가 일치하면 수정, 삭제 기능이 보이도록 진행
    • session에 저장된 user의 정보와 controller를 통해 받아온 user 정보가 일치하게 된다면 수정, 삭제 가능
    • content.jsp
      <%@ 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">&nbsp;&nbsp;
      					<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">&nbsp;&nbsp;
      						<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">&nbsp;&nbsp;
      					</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>
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글