[Spring] Controller에서 Controller로 데이터 전달하기

리트리버J

·

2020. 11. 7. 09:05

728x90

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


나만의 보안(?) 완료




728x90