본문 바로가기
개발 공부 Today I Learned

[국비 67일차 TIL] 글 제목 앞에 new 붙이기, 비밀번호 암호화

by 개발자신입 2024. 2. 28.
반응형

오늘 작성한 글 제목 앞에 new 붙이기

notice-mapper.xml

`if(date_format(now(), '%Y-%m-%d') = date_format(ndate, '%Y-%m-%d'), 1, 0) as ndel`

: 현재 날짜와 `ndate`가 같은지 비교하여 같으면 `1`, 다르면 `0`으로 표시합니다. 이를 통해 오늘 작성된 글을 표시하기 위한 조건을 생성합니다.

‌<select id="noticeList" parameterType="Integer" resultType="notice"> ‌‌SELECT nno, nread, nlike, ntitle, ‌‌if( date_format(now(), '%Y-%m-%d') = date_format(ndate, '%Y-%m-%d'), ‌‌date_format(ndate, '%h:%i'), date_format(ndate, '%m-%d') ) as ndate, ‌‌if(date_format(now(), '%Y-%m-%d') = date_format(ndate, '%Y-%m-%d'), 1, 0) as ndel ‌‌FROM notice WHERE ndel=1 ‌‌ORDER BY nno DESC ‌‌LIMIT #{pageNo}, 10 ‌</select>

notice.jsp

<c:if test="${row.ndel eq 1}"><img alt="new" src="./img/new.png"></c:if>

LoginController.java

‌@GetMapping("/join") ‌public String join() { ‌‌return "join"; }

join.jsp

<script> ‌$(function() { ‌‌// Swal.fire('title','content', 'success'); ‌‌// join을 클릭하면 이벤트 발생 ‌‌$('#join').click(function() { ‌‌‌// Swal.fire('회원가입','버튼을 클릭했습니다.','success'); ‌‌‌// id값 가져오기 ‌‌‌let id = $('#id').val(); ‌‌‌let pw1 = $('#password1').val(); ‌‌‌let pw2 = $('#password2').val(); ‌‌‌let name = $('#name').val(); ‌‌‌let email = $('#email').val(); ‌‌‌// Swal.fire('회원가입', '아이디 : ' + id + "<br>비밀번호 : " + pw1 + "/" + pw2, 'success'); ‌‌‌ ‌‌‌// 전송하기 ‌‌‌let loginForm = $('<form></form>'); ‌‌‌loginForm.attr('name','login'); ‌‌‌loginForm.attr('method','post'); ‌‌‌loginForm.attr('action','/join'); ‌‌‌ ‌‌‌loginForm.append($('<input>', {'type':'hidden', 'name':'id','value':id})); ‌‌‌loginForm.append($('<input>', {'type':'hidden', 'name':'pw1','value':pw1})); ‌‌‌loginForm.append($('<input>', {'type':'hidden', 'name':'name','value':name})); ‌‌‌loginForm.append($('<input>', {'type':'hidden', 'name':'email','value':email})); ‌‌‌ ‌‌‌loginForm.appendTo('body'); ‌‌‌loginForm.submit(); ‌‌}) }); </script> <body id="page-top"> ‌<!-- Navigation 코드 이동 : menu.jsp --> ‌<%@ include file="menu.jsp"%> ‌<div class="container"> ‌‌<div class="content"> ‌‌‌<div class="row"> ‌‌‌‌<div class="col-md-6 order-md-1"> ‌‌‌‌‌<img src="./assets/img/cute.jpg" alt="좌측이미지" class="img-fluid" style="object-fit: contain; margin: 0 auto; height: 100%; margin-top: 100px;"> ‌‌‌‌</div> ‌‌‌‌<div class="col-md-6 order-md-2" style="margin-top: 200px;"> ‌‌‌‌‌<div class="header"> ‌‌‌‌‌‌<h1>회원가입</h1> ‌‌‌‌‌</div> ‌‌‌‌‌<div class="main"> ‌‌‌‌‌‌<form action="#"> ‌‌‌‌‌‌‌<div class="mb-3 row"> ‌‌‌‌‌‌‌‌<label for="id" class="col-sm-2 col-form-label">아이디</label> ‌‌‌‌‌‌‌<div class="col-sm-7"> ‌‌‌‌‌‌‌‌<input type="text" id="id" class="form-control" placeholder="아이디를 입력하세요"> ‌‌‌‌‌‌‌</div> ‌‌‌‌‌‌‌<div class="col-sm-3"> ‌‌‌‌‌‌‌‌<button type="button" id="idCheck" class="btn btn-info w-100">ID 검사</button> ‌‌‌‌‌‌‌</div> ‌‌‌‌‌‌</div> ‌‌‌‌‌‌‌<div class="mb-3 row"> ‌‌‌‌‌‌‌‌<label for="inputPassword" class="col-sm-2 col-form-label">비밀번호</label> ‌‌‌‌‌‌‌<div class="col-sm-5"> ‌‌‌‌‌‌‌‌<input type="password" class="form-control" id="password1" placeholder="암호를 입력하세요"> ‌‌‌‌‌‌‌</div> ‌‌‌‌‌‌‌<div class="col-sm-5"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<input type="password" class="form-control" id="password2" placeholder="암호를 입력하세요"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​</div> ​​​​​​​​​​​​​​​​​​​​​​​​</div> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​<div class="mb-3 row"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<label for="name" class="col-sm-2 col-form-label">이 름</label> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​<div class="col-sm-10"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<input type="text" class="form-control" id="name" placeholder="이름을 입력하세요"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​</div> ‌‌‌‌‌‌</div> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​<div class="mb-3 row"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<label for="email" class="col-sm-2 col-form-label">이메일</label> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​<div class="col-sm-10"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<input type="email" class="form-control" id="email" placeholder="이메일을 입력하세요"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​</div> ​​​​​​​​​​​​​​​​​​​​​​​​</div> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​<div class="mb-3 row"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<div class="col-sm-12"> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<button type="button" id="join" class="btn btn-info">회원가입</button> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​</div> ​​​​​​​​​​​​​​​​​​​​​​​​​​​​</div> ​​​​​​​​​​​​​​​​​​​​​​​​</form> ‌‌‌‌‌</div> ‌‌‌‌</div> ‌‌‌</div> ‌‌</div> ‌</div> </section>

LoginController.java

MemberDTO에 meamil 추가

‌@PostMapping("/join") ‌public String join(HttpServletRequest request) { ‌‌System.out.println(request.getParameter("id")); ‌‌System.out.println(request.getParameter("pw")); ‌‌System.out.println(request.getParameter("name")); ‌‌System.out.println(request.getParameter("email")); ‌‌ ‌‌MemberDTO join = new MemberDTO(); ‌‌join.setMid(request.getParameter("id")); ‌‌join.setMpw(request.getParameter("pw")); ‌‌join.setMname(request.getParameter("name")); ‌‌join.setMemail(request.getParameter("email")); ‌‌ ‌‌int result = loginService.join(join); ‌‌System.out.println("회원가입 결과 : " + result);

 

-> join 생성해주기 ( 서비스, DAO)

LoginService.java

‌public int join(MemberDTO join) { ‌‌return loginDAO.join(join); }

LoginDAO.java

‌public int join(MemberDTO join) { ‌‌return sqlSession.insert("login.join", join); }

login-mapper.xml

‌<!-- 2024-02-28 회원가입 --> ‌<insert id="join" parameterType="memberDTO"> ‌‌INSERT INTO member(mid, mpw, mname, memail) ‌‌VALUES (#{mid}, #{mpw}, #{mname}, #{memail}) ‌</insert>

데이터베이스 암호화

사용자의 입력 -> jsp -> spring -> DB

눈으로 볼 수 있는 평문저장이 아니라 암호화해서 저장해야 함.

  • 구간 : http 80 / https 443
  • 스프링 시큐리티 (스프링 mybatis db) : 사용자가 jsp -> spring-> DB
  • DB암호화 : 데이터베이스에 저장된 암호만 암호화

-- 암호화하기 

SELECT HEX( ‌AES_ENCRYPT('01234567','testtest') ) FROM DUAL;


-- 뱽? s?<諂?V = 93A3F6522073DA94113CF4DB17EA7F56 (HEX code)

-- 복호화 (-> 평문화)

SELECT AES_DECRYPT(UNHEX('93A3F6522073DA94113CF4DB17EA7F56'),'testtest') FROM DUAL;


-- MD5 : 단방향, 복호화 불가

select MD5('01234567') FROM DUAL;

 -- 2e9ec317e197819358fbc43afca7d837

SELECT HEX(AES_ENCRYPT(MD5('01234567'),'testtest')) FROM DUAL;


-- SHA2

SELECT SHA2('01234567', 256) FROM DUAL;


-- 결과 : 924592b9b103f14f833faafb67f480691f01988aa457c0061769f58cd47311bc

SELECT mpw FROM member; -- 암호키 Daiso -- HEX(AES_ENCRYPT('mpw','Daiso')) UPDATE member SET mpw='01234567' UPDATE member SET mpw=HEX(AES_ENCRYPT(mpw,'Daiso'))


-> 데이터 테이블에서 mpw의 길이 늘리기

 

login-mapper.xml

mpw부분 변경
1. select 구문에서는 mpw as pw를  AES_DECRYPT(UNHEX(mpw),'Daiso') as pw  이렇게 변경.

‌<select id="login" parameterType="loginDTO" resultType="loginDTO"> ‌<![CDATA[ ‌‌SELECT COUNT(*) as count, mname, mcount, AES_DECRYPT(UNHEX(mpw),'Daiso') as pw ‌‌FROM member ‌‌WHERE mid=#{id} AND mgrade > 4 ]]> ‌</select>

 

2. insert 구문에서는 #{mpw} 를 HEX(AES_ENCRYPT(${mpw},'Daiso')) 로 변경

‌<insert id="join" parameterType="memberDTO"> ‌‌INSERT INTO member(mid, mpw, mname, memail) ‌‌VALUES (#{mid}, HEX(AES_ENCRYPT(${mpw},'Daiso')), #{mname}, #{memail}) ‌</insert>

결과

신규 가입시에도 비밀번호가 암호화되어서 DB에 저장됨.


 


회원가입 로직

 

https://developlsb2dwb.tistory.com/21 참고블로그

 

반응형

댓글