[Spring] Controller에서 Controller로 데이터 전달하기
리트리버J
·2020. 11. 7. 09:05
Spring Ajax 사용 도중 Chrome F12에서 이메일 인증번호를 바로 얻어올 수 있는 보안(?)문제가 발생하였다.
1. jsp에서 Ajax를 통해 data(이메일 인증번호)를 받아와 dice변수에 저장한다.
이로써, console창에서 dice를 입력하면 인증번호를 받아올 수 있게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | // 이메일 인증번호 전송 function emailNum(){ let email = $("#email").val(); $(".signupbox_signup").prepend( "<div class='loading-container'><div class='loading'></div><div id='loading-text'>loading</div></div>" ); $.ajax({ url:"emailNum.do", data:{email:email}, type:"post", success:function(data){ console.log(data); if(data !== "fail"){ $(".loading-container").remove(); alert("메일이 발송되었습니다. 인증번호를 입력해 주세요."); dice = data; $("#email").attr("readonly",true); $("#email").css("background-color","rgb(225,225,225)"); $("#ranNum").focus(); }else{ alert("메일 발송에 실패하였습니다."); $(".loading-container").remove(); $("#email").focus(); } }, error:function(jqxhr, textStatus, errorThrown){ console.log("ajax 처리 실패"); // 에러 로그 console.log(jqxhr); console.log(textStatus); console.log(errorThrown); $("#email").focus(); } }); }; | cs |
2. Controller("emailNum.do")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | /** * 2. EMAIL 인증 * @param email * @return * @throws IOException */ @ResponseBody @RequestMapping(value = "emailNum.do", method=RequestMethod.POST) public String mailSending(String email) throws IOException { System.out.println("들어왔다"); // 인증번호 난수(랜덤 숫자) Random r = new Random(); // 이메일로 받는 인증코드 부분 (난수) (0 ~ 4589361) + 49311; int dice = r.nextInt(4589362) + 49311; // 보내는 사람 Email String setfrom = "cjsehdals0430@gmail.com"; // 받는 사람 Email String tomail = email; // 제목 String title = "회원가입 인증 이메일 입니다."; // 내용 String content = System.getProperty("line.separator") + // 현재 OS에 맞는 개행 문자를 사용할 수 있다. System.getProperty("line.separator") + "안녕하세요 회원님 저희 홈페이지를 찾아주셔서 감사합니다" + System.getProperty("line.separator") + System.getProperty("line.separator") + "인증번호는 " + dice + " 입니다. " + System.getProperty("line.separator") + System.getProperty("line.separator") + "받으신 인증번호를 홈페이지에 입력해 주시면 다음으로 넘어갑니다."; try { // 이메일 메세지 보낼 수 있는 객체 라이브러리 MimeMessage message = mailSender.createMimeMessage(); // MimeMessage를 도와주는 객체 라이브러리 MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); // MimeMessageHelper 양식 messageHelper.setFrom(setfrom); // 보내는 사람 E-mail messageHelper.setTo(tomail); // 받는 사람 E-mail messageHelper.setSubject(title); // 메일 제목 (생략 가능) messageHelper.setText(content); // 메일 내용 // 인증번호 출력용 System.out.println("인증번호 :" + dice); // 사진 파일 전송 FileSystemResource file = new FileSystemResource(new File("C:\\Users\\drnew\\Pictures\\g.gif")); messageHelper.addInline("g.gif", file); // MimeMessage 전송 mailSender.send(message); // String으로 넘겨주기위해 Integer를 이용한다. String diceString = Integer.toString(dice); return diceString; } catch (Exception e) { System.out.println(e); return "fail"; } } | cs |
3. 받아온 dice + ".do"를 통해 다시 Controller로 넘어가서,
발송된 이메일 인증번호와 사용자가 입력한 userNum을 전달한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // 이메일 인증번호 체크 function numCheck(){ let userNum = $("#ranNum").val(); $.ajax({ url: dice + ".do", data: {confirm_number : userNum}, type:"post", success:function(data){ console.log(data); if(data !== "fail"){ alert("번호가 인증되었습니다.") }else{ alert("인증에 실패하였습니다."); } }, error:function(jqxhr, textStatus, errorThrown){ console.log("ajax 처리 실패"); // 에러 로그 console.log(jqxhr); console.log(textStatus); console.log(errorThrown); } }); } | cs |
4. value = "{dice.do}"의 dice변수를 이용하기 위하여 @PathVariable 어노테이션을
첨가해주고, 인증번호를 비교한다.
1 2 3 4 5 6 7 8 9 10 | @ResponseBody @RequestMapping(value = "{dice}.do", method = RequestMethod.POST) public String join_injeung(Model model, String confirm_number, @PathVariable String dice, Dice diceObj) throws IOException { // @PathVaribale : value의 {dice}를 받아온다. System.out.println(diceObj.getDice()); System.out.println("인증번호 : " + dice); System.out.println("사용자가 입력한 인증번호 : " + confirm_number); if (confirm_number.equals(dice)) return "ok"; return "fail"; } | cs |
아무 이메일이나 입력한 후에, 인증번호를 크롬 F12 console창에서 얻어올 수가 있다.
그렇다면 이메일 인증의 의미가 없어진다.
Controller에서 Controller로 값을 전달할 방법을 생각하다가,
vo객체를 만들어
setter로 인증번호를 저장하고
getter로 불러오면 어떨까?
라는 생각이 들었다.
6. vo 객체
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import org.springframework.stereotype.Component; // Controller에서 Autowired로 Bean등록 해주기 우히여 Component 어노테이션을 첨가한다. @Component("diceObj") public class Dice { private String dice; private String btn; public Dice() { super(); // TODO Auto-generated constructor stub } public Dice(String dice, String btn) { super(); this.dice = dice; this.btn = btn; } public String getDice() { return dice; } public void setDice(String dice) { this.dice = dice; } public String getBtn() { return btn; } public void setBtn(String btn) { this.btn = btn; } @Override public String toString() { return "Dice [dice=" + dice + ", btn=" + btn + "]"; } } | cs |
7. Contoller를 실행할 때 마다 Dice 객체가 초기화 되지 않게 하기 위해 전역변수로 등록 후, @Component("diceObj")로 등록한 Dice를 연결시켜 주기 위해 @Autowired를 걸어준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | // 이메일 인증 비밀번호 @Autowired private Dice diceObj; /** * 2. EMAIL 인증 * @param email * @return * @throws IOException */ @ResponseBody @RequestMapping(value = "emailNum.do", method=RequestMethod.POST) public String mailSending(String email, Model model) throws IOException { int result = uService.emailCheck(email); // 이메일 중복 존재 할 때 if(result > 0) { return "duplicate"; // 이메일 중복 X }else { // 인증번호 난수(랜덤 숫자) Random r = new Random(); // 이메일로 받는 인증코드 부분 (난수) (0 ~ 4589361) + 49311; int diceInt = r.nextInt(4589362) + 49311; // String으로 바꿔준다. String dice = Integer.toString(diceInt); diceObj.setDice(dice); // 보내는 사람 Email String setfrom = "cjsehdals0430@gmail.com"; // 받는 사람 Email String tomail = email; // 제목 String title = "회원가입 인증 이메일 입니다."; // 내용 String content = System.getProperty("line.separator") + // 현재 OS에 맞는 개행 문자를 사용할 수 있다. System.getProperty("line.separator") + "안녕하세요 회원님 저희 홈페이지를 찾아주셔서 감사합니다" + System.getProperty("line.separator") + System.getProperty("line.separator") + "인증번호는 " + dice + " 입니다. " + System.getProperty("line.separator") + System.getProperty("line.separator") + "받으신 인증번호를 홈페이지에 입력해 주시면 다음으로 넘어갑니다."; try { // 이메일 메세지 보낼 수 있는 객체 라이브러리 MimeMessage message = mailSender.createMimeMessage(); // MimeMessage를 도와주는 객체 라이브러리 MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); // MimeMessageHelper 양식 messageHelper.setFrom(setfrom); // 보내는 사람 E-mail messageHelper.setTo(tomail); // 받는 사람 E-mail messageHelper.setSubject(title); // 메일 제목 (생략 가능) messageHelper.setText(content); // 메일 내용 // 인증번호 출력용 System.out.println("랜덤 생성된 인증번호 :" + dice); // MimeMessage 전송 mailSender.send(message); model.addAttribute("dice", dice); return "ok"; } catch (Exception e) { System.out.println(e); return "fail"; } } } /** * 2─1. EMAIL 인증번호 비교 메소드 * @param model * @param confirm_number * @param dice * @return * @throws IOException */ @ResponseBody @RequestMapping(value = "dice.do", method = RequestMethod.POST) public String join_injeung(String confirm_number) throws IOException { String dice = diceObj.getDice(); System.out.println("인증번호 : " + dice); System.out.println("사용자가 입력한 인증번호 : " + confirm_number); // 인증번호가 일치할 경우 인증번호가 맞다는 창을 출력하고 회원가입창으로 이동함 if(dice != null) { // 확인버튼 누를 때 if (confirm_number.equals(dice)) { // 확인 버튼 눌렀는지 체크용 diceObj.setBtn("ok"); return "ok"; } // 회원가입 버튼 누를 때 ( 확인 버튼 누른 후에 회원가입 버튼 눌러야 회원가입이 될 수 있도록) else if(!confirm_number.equals(dice)) { // 확인 버튼 눌르면 getBtn()이 ok if(diceObj.getBtn() == "ok") { return "ok"; // 확인 버튼 안누르면 getBtn()이 null }else { return "fail"; } } } return "fail"; } | cs |
나만의 보안(?) 완료
'Spring > Spring Web' 카테고리의 다른 글
[Spring] 파일 업로드 (0) | 2020.11.07 |
---|---|
[Spring / JSON / SQL] 다중행 SQL을 JSONArray에 담아 jsp에 parse 후 출력하기. (0) | 2020.11.07 |
[Spring] 회원가입, 로그인 비밀번호 암호화 처리 (0) | 2020.11.07 |
[Spring] @어노테이션 정리 (0) | 2020.11.07 |
[Spring] Spring과 Ajax연결하기 (0) | 2020.11.07 |