ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ€ํ„ฐ ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. ๋งคํผ ์ชฝ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ 2๊ฐœ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†์œผ๋‹ˆ ๋กœ๊ทธ์ธ ์ „์šฉ LoginVO๋ฅผ ์ƒ์„ฑ ํ•ด์ฃผ์—ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  DB์—์„œ ๋กœ๊ทธ์ธ ์‹œ๋„ํ•˜๋Š” ํšŒ์›์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. null์„ ๋ฆฌํ„ดํ•˜๋ฉด ํ•ด๋‹น๋˜๋Š” ํšŒ์›์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๊ณ  email์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์›์ด ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ํšŒ์›์˜ ์ „์ฒด ์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

controller๋‹จ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ›์•„์˜จ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ์ดํ„ฐ์™€ ์กฐํšŒํ•œ ํšŒ์›์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•ด์„œ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜๊ณผ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์„ธ์…˜์˜ ์ˆ˜๋ช…์€ ๋ธŒ๋ผ์šฐ์ € ์‹คํ–‰๋ถ€ํ„ฐ ์ข…๋ฃŒ๊นŒ์ง€์ด๊ณ (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ์„ธ์…˜์˜ ์ˆ˜๋ช…์ด ๋‹คํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ์„ธ์…˜์˜ ์œ ํšจ์‹œ๊ฐ„ ๋•Œ๋ฌธ! ๋”ฐ๋กœ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค) ์ฟ ํ‚ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ์ปฌ์ €์žฅ์†Œ(ํ•˜๋“œ๋””์Šคํฌ, ๊ธฐ์–ต์žฅ์น˜ ๋“ฑ)์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜์€ ๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์“ฐ์ด๊ณ  ์ฟ ํ‚ค๋Š” ์ž๋™๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์“ฐ์ธ๋‹ค.

 

 

 

Controller


UsersController

//๋กœ๊ทธ์ธ ๊ฒ€์ฆ ์š”์ฒญ
@PostMapping("/loginCheck")
public String login(@RequestBody LoginVO login, HttpSession session) throws Exception {
	
	logger.info("/user/loginCheck : post์š”์ฒญ");
	
	//ํŒŒ๋ผ๋ฏธํ„ฐ ํ™•์ธ
	System.out.println("๋กœ๊ทธ์ธ ์‹œ๋„ํ•œ ํšŒ์› : " + login);
	
	BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
	String result = null;
	
	//์„œ๋น„์Šค๋‹จ - ๋กœ๊ทธ์ธ ์‹œ๋„ํ•œ ํšŒ์›์˜ ๋ชจ๋“  ํšŒ์›์ •๋ณด ์กฐํšŒํ•ด์„œ userVO๊ฐ์ฒด์— ์ €์žฅ
	UsersVO user = usersService.login(login);
	System.out.println("๋กœ๊ทธ์ธ ์‹œ๋„ํ•œ ํšŒ์›์˜ ๋ชจ๋“  ์ •๋ณด : " + user);
	
	//์•„์ด๋”” ์กด์žฌ -> ๊ฐ€์ž…๋œ ํšŒ์›์ด ์กด์žฌ -> ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ํ•„์š”
	if(user != null) {
		
		//๋น„๋ฐ€๋ฒˆํ˜ธ ์ผ์น˜ -> ๋กœ๊ทธ์ธ์„ฑ๊ณต
		if(encoder.matches(login.getPw(), user.getPw())) {
			result = "loginSuccess";
			
			//๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ ๋กœ๊ทธ์ธ ์œ ์ง€๋ฅผ ์„ค์ • -> ์„ธ์…˜ ์‚ฌ์šฉ
			//login์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์„ธ์…˜์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ๋žŒ์˜ ์ „์ฒด ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
			session.setAttribute("login", user);
			System.out.println("login ์„ธ์…˜ ํ™•์ธ : " + user);
			
			//๋ธŒ๋ผ์šฐ์ € ๋‹ซ์„ ๋•Œ๊นŒ์ง€ ํ˜น์€ ์„ธ์…˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์„ธ์…˜์ด ์‚ฌ์šฉ๋จ
			//session.setMaxInactiveInterval(60 * 60); //์„ธ์…˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ 1์‹œ๊ฐ„์œผ๋กœ ์„ค์ •
			
		}
		//๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜
		else {
			result = "pwFail";
		}
	}
	//์ด๋ฉ”์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ
	else { 
		result = "emailFail";
	}
	return result;
	
}

DB์— ๋น„๋ฒˆ์„ ์ €์žฅํ•  ๋•Œ ์•”ํ˜ธํ™” ์‹œ์ผœ์„œ ์ €์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋””์ฝ”๋”ฉํ•ด์„œ ๋น„๊ตํ•ด์•ผํ•˜๋Š”๋ฐ ๋””์ฝ”๋”ฉํ•ด์„œ ๋ฌธ์ž๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋Š” ์—†๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ๋””์ฝ”๋”ฉํ•ด์„œ ๋น„๊ตํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. ํด๋ž˜์Šค BCryptPasswordEncoder์— ํ•จ์ˆ˜ matches ์‚ฌ์šฉ

encoder.matches(๋‚  ๊ฒƒ์˜ ๋ฌธ์ž, ์ธ์ฝ”๋”ฉ ๋œ ๋ฌธ์ž)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•œ email๊ณผ pw๋ฅผ ๊ฐ€์ง€๊ณ  DB์—์„œ ํšŒ์›์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด์„œ ๋ถˆ๋Ÿฌ์˜จ ๋‹ค์Œ ๊ฐ’ ๋น„๊ต๋ฅผ ํ†ตํ•ด

  1. email ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ๋ฌธ์ž์—ด emailFail ์ „์†ก
  2. pw๊ฐ€ ํ‹€๋ฆฐ ๊ฒฝ์šฐ pwFail ์ „์†ก
  3. ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ loginSuccess ๋ฅผ ์ „์†กํ•œ๋‹ค.

 

์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. HttpServletRequest ๊ฐ์ฒด ์‚ฌ์šฉ .getSession(); -> ์š”์ฒญ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋™์‹œ์— ์ถ”๊ฐ€์ ์œผ๋กœ ์–ป์„ ๋•Œ ์‚ฌ์šฉ
  2. HttpSession ๊ฐ์ฒด ์‚ฌ์šฉ -> ๊ทธ๋ƒฅ ์„ธ์…˜๋งŒ ํ•„์š”ํ•˜๋‹ค ํ•  ๋•Œ ์‚ฌ์šฉ

HttpSession์„ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ ๊ฐ์ฒด๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•œ๋‹ค.

 

 

 

Service


UsersService

//๋กœ๊ทธ์ธ ์‹œ๋„ ํšŒ์›์ •๋ณด ์กฐํšŒ ์ฒ˜๋ฆฌ
@Override
public UsersVO login(LoginVO login) throws Exception {
	return usersDAO.login(login);
}

 

 

 

 

View


login.jsp

//๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
$('#login-btn').click(function(e) {
	
	if(chk1 && chk2) {
		
		const email = $('#login_email').val();
		const pw = $('#login_pw').val();
		
		//์ฝ˜์†”์— ๊ฐ’ ์ถœ๋ ฅ
		console.log("email: " + email);
		console.log("pw: " + pw);
		
		//json๊ฐ์ฒด์— ๋‹ด๊ธฐ
		const userInfo = {
			email: email,
			pw: pw
		};
		
		$.ajax({
			type: "POST",
			url: "/myapp/user/loginCheck",
			headers: {
				"Content-Type": "application/json",
                "X-HTTP-Method-Override": "POST"
			},
			data: JSON.stringify(userInfo),
			dataType: "text",
			success: function(data) {
				
				console.log("result:" + data);
				
				if(data === "emailFail") {
					$('#alert_msg').html('<p>์ž…๋ ฅํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์ •์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.</p>');
					$('#login_email').focus();
					
				} else if(data === "pwFail") {
					$('#login_pw').focus();
					$('#alert_msg').html('<p>์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ™•์ธํ•˜์„ธ์š”.</p>');
					
				} else if(data === "loginSuccess") {
					alert("๋กœ๊ทธ์ธ์„ฑ๊ณต!");
					self.location="/myapp/post/list";
				}
			}
		}); //ํ†ต์‹ ๋!
	
	} else {
		alert('์ž…๋ ฅ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜์„ธ์š”');
	}
});

 

 

 

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€