1. ์ฟ ํค๊ฐ ํ๋ ์ญํ ์ด ๋ฌด์์ผ๊น?
ํน์ ์น์ฌ์ดํธ์๋ ์์ด๋ ๊ธฐ์ตํ๊ธฐ๋ ์ฅ์น๊ฐ ์๋ค. ์ด๋ ํ๋ฒ ๋ก๊ทธ์ธ ํ์ผ๋ฉด ๋ค์์ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ์ฌ๋ฐฉ๋ฌธ ํ์ ๋, ํด๋น ์์ด๋๊ฐ ๋ฏธ๋ฆฌ ์ฐํ ์๋๋ก ํ๋ ๊ฒ์ด๋ค.
๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํตํด ์ฟ ํค๊ฐ ๋ญ ์๋ ํ์ธํด๋ณด๋ฉด, id๋ ์ด๋ฆ์ผ๋ก ์ฟ ํค๊ฐ ๋ค์ด์๋ ๊ฒ์ ์ ์ ์๋ค.
์์์ ๋ฐฐ์ ๋ค์ํผ, HTTP๋ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๋๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๋ ์ฐ์์ ์ผ๋ก ์จ ๋ ์์ฒญ์ด ๊ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ์ ์จ ๊ฒ์ธ์ง, ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์๊ฒ์ ์จ ๊ฒ์ธ์ง ์ ์ ์๋ค. ํ์ง๋ง ๋๋๋ก ์๋ฒ๊ฐ ์ ํด๋ผ์ด์ธํธ์ ํ๋์ ๊ธฐ์ตํด์ผ๋ง ์ฒ๋ฆฌํ ์ ์๋ ์ผ์ด ์๋ค. (ex - ๋ก๊ทธ์ธ ํ์๋ง ํ ์ ์๋ ํ๋ ๋ฑ)
์ฟ ํค๋ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๊ธฐ์ ์ด๋ค. ์๋ฒ๊ฐ ์ฟ ํค๋ฅผ ์ด์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ๋ณํ ์ ์๋ค.
2. ๊ทธ๋์ ์ฟ ํค๋?
์ฟ ํค๋ ํ๋์ ๊ฐ์ฒด์ด๋ค.
์ฟ ํค๋ ์ด๋ฆ๊ณผ ๊ฐ์ ์์ผ๋ก ๊ตฌ์ฑ๋ ์์ ์ ๋ณด์ด๋ค.
์ด ์ ๋ณด๋ ์ค๋ก์ง ์์คํค ๋ฌธ์๋ก๋ง ์์ฑ๋์ด ์๋ค. (ASCII-๋ฌธ์๋ ๋ง๊ตญ๊ณตํต์ด๊ธฐ ๋๋ฌธ์)
๋ง์ฝ ์ฟ ํค ์์ ํ๊ธ ์ ๋ณด๋ฅผ ๋ฃ์ด์ผ ํ๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ์ ์คํธ๋ง ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ผ ๋ ์ฒ๋ผ ์ธ์ฝ๋ฉ์ ํด์ค์ผ ํ๋ค.
๋ํ ์ฟ ํค์ ๋ค์ด๊ฐ๋ ๊ณ๊ฐ์ง ์ ๋ณด๋ก๋
ํด๋น ์ฟ ํค์ ์ ํจ๊ธฐ๊ฐ, ํด๋น ์ฟ ํค๊ฐ ์ฐ์ด๋ ๋๋ฉ์ธ,๊ฒฝ๋ก ์ฃผ์๋ฑ์ด ์๋ค.
*๋๋ฉ์ธ์ด๋?
์ฃผ์์ ์ด๋ฆ์ ๋งํ๋ค. ๋ฐ์ ์์์ ๋์จ ์์ญ๊น์ง๋ฅผ ๋๋ฉ์ธ์ด๋ผ ๋งํ๊ณ , ์ด์ wix.com/rigister ๋ wix.com/buylist ๊ฐ์ด ๋๋ฉ์ธ ์์ ๋ค์ด๊ฐ์ ํ๋ํ๊ธฐ ์ํ ์ธ๋ถ ์ฃผ์๋ฅผ ๊ฒฝ๋ก ์ฃผ์๋ผ๊ณ ํ๋ค.
์ฟ ํค๋ ์ ํจ๊ธฐ๊ฐ์ด ๋๋๋ฉด ์๋์ผ๋ก ์ญ์ ๋๋๋ก ์ค์ ๋์ด ์๋ค.
์ ํจ๊ธฐ๊ฐ์ ์๋์๊ฐ๊ณผ ์ ๋์๊ฐ์ผ๋ก ๋๋๋ค.
์๋์๊ฐ์ ์ฟ ํค๊ฐ ๋ง๋ค์ด์ง ์์ ๋ถํฐ ์ฃฝ์ ์๊ฐ๊น์ง ์นด์ดํธ ๋ค์ด ๋๋ ๊ฒ์ด๊ณ ,
์ ๋์๊ฐ์ ์ ํํ ๋ ์์ผ ์๋ถ์ด๊ฐ ์ ํ ์๋ ๊ฒ์ด๋ค.
์ปดํจํฐ๋ง๋ค ์๊ณ๊ฐ ์ด๊ธ๋์์ ์ ์์ผ๋ฏ๋ก, ์ ๋์๊ฐ๊ณผ ๊ฐ์ด ์๋์๊ฐ๋ ์ฟ ํค ์์ ์ ์ฅ๋๋ค.
์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋์ด ์๋๋ฐ, ๋๋ฉ์ธ+๊ฒฝ๋ก์ฃผ์ ๋ณ๋ก ์ฟ ํค๊ฐ ๊ฐ๊ฐ ์กด์ฌํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ผ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ ๋๋ฉ์ธ + ๊ฒฝ๋ก ์ฃผ์์ ์ผ์นํ๋ ์ฟ ํค๊ฐ ๋ธ๋ผ์ฐ์ ์ ์๋ค๋ฉด,
๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฟ ํค๋ฅผ ์๋ฒ์ ๊ฐ์ด ๋ณด๋ธ๋ค. ์ด์ ๊ด๋ จ๋ ์์ธํ ์ ๋ณด๋ ๋ฐ์์ ์์๋ณด์.
3. ์ฟ ํค๊ฐ ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์ฌ์ด๋ฅผ ์ค๊ฐ๋ ๊ณผ์
a. ๋จผ์ ์ฟ ํค๊ฐ ์์ด์ผ ํ๋ ์์ฒญ์ด ๋ค์ด์จ๋ค. (์์์๋ ํด๋ผ์ด์ธํธ์ ์์ด๋ ๊ธฐ์ต)
b. ์๋ฒ์์ ์ฟ ํค๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง๋ ์ฟ ํค๋ฅผ response ๊ฐ์ฒด์ ์ ์ฅํ๋ค.
c. response ๊ฐ์ฒด์ ์ฟ ํค๋ฅผ ์ ์ฅํ๋ฉด ํฐ์บฃ์์ response ๊ฐ์ฒด๋ฅผ ๋ณด๊ณ ์๋ต ๋ฉ์ธ์งHTTP๋ฅผ ๋ง๋ค์ด์ค.
d. ์๋ต ๋ฉ์ธ์ง ํค๋์ ์ฟ ํค๋ฅผ ๋ง๋ค๋ผ๋ Set-Cookie ๋ช ๋ น๊ณผ ์ ์ฅํด์ผํ ์ฟ ํค ์ ๋ณด๋ ๊ฐ์ด ์ ํ.
e. ๊ทธ๋ฌ๋ฉด ์ฟ ํค ์ ๋ณด๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋๋ฉ์ธ+๊ฒฝ๋ก์ฃผ์๋ก ์์ฒญ์ ํ์ ๋ ์ด ์ฟ ํค๋ ๋ธ๋ ค์ ๊ฐ์ด ๊ฐ๋ค.
์์ด๋๋ฅผ ๊ธฐ์ตํ๋ ์๋ฆฌ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด
์ค์ํ ์์๋ฅผ ๋ค๋ฉด, ๋์๊ด์ ์ฒ์ ๊ฐ์๋, ์ฌ์๊ฐ ๋ํํ ๋์๊ดID ์นด๋๋ฅผ ๋ง๋ค์ด์ค ๊ฒ๊ณผ ๊ฐ๋ค.
๋ ๊ทธ ๋ค์๋ถํฐ ๋์๊ด์ ๋ค์ด๊ฐ ๋ ๊ทธ ID ์นด๋๋ฅผ ์ฐ๋ฉด ๋๋ค.
4. ์ฟ ํค ๋ฌธ๋ฒ
// 1. ์ฟ ํค ๊ฐ์ฒด ์์ฑ
Cookie cookie = new Cookie("id", "asdf"); // name๊ณผ value ์
cooike.setMaxAge(60*60*24); // ์ ํจ์๊ฐ ์ค์ (๊ธฐ๋ณธ ๋จ์๊ฐ ์ด์ ์ฌ๊ธฐ์ 24์๊ฐ ์ค์ )
response.addCookie(cookie); // response ๊ฐ์ฒด์ ๋ด์์ผ ์๋ตHTTP ๋ฉ์ธ์ง์ ๋ธ๋ ค ๋ค์ด๊ฐ.
// ์ด๊ฑฐ ์ ์ฐ๋ฉด ๋ง์งฑ ๋๋ฃจ๋ฌต
// 2. ์ฟ ํค ์ญ์
Cookie cookie = new Cookie("id",""); //์ญ์ ํ ์ฟ ํค์ name์ ์ณ์ผํจ. value๋ ์ณ๋ ๋๊ณ ์ ์ณ๋ ๋จ.
cookie.setMaxAge(0); //์ ํจ์๊ฐ์ 0์ผ๋ก ๋ง๋ค์ด์ฃผ๋ฉด, ์ญ์ ๋จ์ ์ด์ฉ
response.addCookie(cookie); //๋ณ๊ฒฝ ๋ด์ฉ์ ๊ฐฑ์ ํด์ผํจ.
// 3. ๋ด์ฉ ๋ณ๊ฒฝ
cookie.setValue(URLEncoder.encode("์ ์๋ฏผ")); //๊ฐ ๋ณ๊ฒฝ - ํ๊ธ์ ์ธ์ฝ๋ฉ ํด์ค์ผํจ์ ๊ธฐ์ตํ์.
cookie.setDomain("www.fastcampus.co.kr"); //๋๋ฉ์ธ ๋ณ๊ฒฝ
cookie.setPath("/ch") //๊ฒฝ๋ก์ฃผ์ ๋ณ๊ฒฝ
cookie.setMaxAge(60*60*24*7); //์ ํจ๊ธฐ๊ฐ ๋ณ๊ฒฝ
response.addCookie(cookie); //์๋ต์ ์ฟ ํค ์ถ๊ฐ
// 4. ๋ค์ ์๋ฒ๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ์ฟ ํค ์ฝ์ด์ค๊ธฐ.
Cookies[] cookies = request.getCookies(); //request ๊ฐ์ฒด์ ํฐ์บฃ์ด ๋ฃ์ด์ค ์ฟ ํค์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ.
//์ฟ ํค๊ฐ ์์ผ๋ฉด null์ด ๋จ๊ธฐ ๋๋ฌธ์ null check ํ์
for(Cookie cookie : cookies) {
String name = cookies.getName();
String value = cookie.getValue(); // ๊ฐ ์ฝ๊ธฐ
System.out.printf("[cookie]name=%s, value=%s%n", name, value) //์ถ๋ ฅ
}
5. ์ฝ๋ ๋ฆฌ๋ทฐ (HTML/์ฃผ์๋ฌ๊ธฐ)
/*1.CSS */
<style>
/* boder-box -> ํ
๋๋ฆฌ์ ์์ชฝ ์ฌ๋ฐฑ๋ box ๋๋น ๊ณ์ฐ ์ ํฌํจ. */
* { box-sizing:border-box; }
a { text-decoration: none; }
form {
width:400px;
height:500px;
display : flex;
flex-direction: column;
align-items:center;
/* absolute๋ ๋ถ๋ชจ ์์์ค ์ฒ์์ผ๋ก static์ด ์๋ ์์์ ๋ํ์ฌ ์ ์ฉ
top: 50% ๋ ๋ถ๋ชจ ์์ ๋งจ ์์์ 50%๋งํผ ๋จ์ด์ง๊ฒ ๋ค๋ ์๋ฆฌ
๊ทผ๋ฐ ์ด๊ฒ ์ผ์ชฝ ์ ๋ชจ์๋ฆฌ๊ฐ ๊ธฐ์ค์ด๋ผ์, ๋ฐ์ค ์์ฒด๊ฐ ์ ๊ฐ์ด๋ฐ ์ค์ง ๋ชปํจ.*/
position : absolute;
top:50%;
left:50%;
/*๊ทธ๋์ ์์ ํ ์ค์ ๋ง์ถ๊ธฐ ์ํด transform ํ๊ทธ ์ด์ฉ
translate(์ํ, ์์ง): ๋ณธ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธก์
translate(-50%,-50%)
๋ณธ ์์น์์ 50ํผ๋งํผ ์ผ์ชฝ์ผ๋ก, 50ํผ๋งํผ ์๋ก
*/
transform: translate(-50%, -50%) ;
border: 1px solid rgb(89,117,196);
border-radius: 10px;
}
input[type='text'], input[type='password'] {
width: 300px;
height: 40px;
border : 1px solid rgb(89,117,196);
border-radius:5px;
padding: 0 10px;
margin-bottom: 10px;
}
button {
background-color: rgb(89,117,196);
color : white;
width:300px;
height:50px;
font-size: 17px;
border : none;
border-radius: 5px;
margin : 20px 0 30px 0;
}
#title {
font-size : 50px;
margin: 40px 0 30px 0;
}
#msg {
height: 30px;
text-align:center;
font-size:16px;
color:red;
margin-bottom: 20px;
}
</style>
<!--2.HTML -->
<body>
<!--form์ ๋ง์ง๋ง ๋ณด๋ด๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด formCheck๋ ํจ์์ ํด๋น ์
๋ ฅ๋ค ๋ฃ์ด๋ด๋ผ.
๋ง์ฝ ๋ฐํ ๊ฐ์ด false๋ฉด ๋ณด๋ด์ง ๋ง๊ณ , ๋ฐํ ๊ฐ์ด true๋ฉด
/Login/login ์ฃผ์๋ก post์์ฒญ(๋ฐ์ดํฐ์ ๊ธ์ฐ๊ธฐ)์ ํด๋ผ.-->
<form action="<c:url value='/login/login'/>" method="post" onsubmit="return formCheck(this);">
<h3 id="title">Login</h3>
<div id="msg">
<!--test = ๋ง์ฝ ~์ด๋ฉด if ํ๊ทธ ์์ ๋ฌธ์ฅ ์คํ
not empty ~: ~๊ฐ ์ ๋น์ด์์ผ๋ฉด -->
<c:if test="${not empty param.msg}">
<i class="fa fa-exclamation-circle"> ${URLDecoder.decode(param.msg)}</i>
</c:if>
</div>
<!-- value๋ ๋ง์ฝ cookie ๊ฐ์ด ์์ผ๋ฉด ์ ํ๋๋ก -->
<input type="text" name="id" value="${cookie.id.value }" placeholder="์ด๋ฉ์ผ ์
๋ ฅ" autofocus>
<input type="password" name="pwd" placeholder="๋น๋ฐ๋ฒํธ">
<button>๋ก๊ทธ์ธ</button>
<div>
<!-- ์ผํญ ์ฐ์ฐ์๋ก ๋ง์ฝ ์ฟ ํค๊ฐ ๋น์ด์์ผ๋ฉด ์์ ๊ณ ์์ผ๋ฉด checked ์์ฑ ๋ฃ๊ธฐ -->
<label><input type="checkbox" name="rememberId" ${empty cookie.id.value ? "" : "checked" }> ์์ด๋ ๊ธฐ์ต</label> |
<a href="">๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ</a> |
<a href="">ํ์๊ฐ์
</a>
</div>
<script>
/* ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์ ์ ์ธ
var -> ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ๊ณ์ ์ฌ์ ์ธํด๋ ์๋ฌ๊ฐ ์ ๋จ.
์ ๋ถ ์ถ๋ ฅํด์ค.
var name = 'javascript'
var name = 'bathingape'
๋ ๋ค ok
let -> ์ผ๋ฐ ์ธ์ด๋ค์ ๋ณ์ ์ ์ธ๊ณผ ๊ฐ์ ๋๋
์ฌ์ ์ธ์ ์๋๋ ์ฌํ ๋น(๋์
)์ ๋๋ค.
var์ ์์ ๋ถ๊ฐ.
let name = 'javascript'
name = 'bathingape'
์ด๊ฑด ๊ฐ๋ฅ.
const > ์ฌ์ ์ธ, ์ฌํ ๋น ๋ชจ๋ ๋ถ๊ฐ
ํ๋ฒ ์ด๊ธฐํ ํ์ผ๋ฉด ๊ทธ๋๋ก ๊ฐ์ผํจ.
*/
function formCheck(frm) {
let msg ='';
if(frm.id.value.length==0) {
setMessage('id๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.', frm.id);
return false;
}
if(frm.pwd.value.length==0) {
setMessage('password๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.', frm.pwd);
return false;
}
return true;
}
function setMessage(msg, element){
// msg๋ id๋ฅผ ๊ฐ์ง ์์๋ฅผ ์ฐพ์์
// ๊ทธ ์์ ๋ด์ฉ๋ฌผ์ ์ธ์๋ก ๋ฐ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋ผ.
// innerHTML์ ํด๋น ํ๊ทธ ์์๊ฐ <> <> ์ฌ์ด์ ๊ฐ์ง ๋ด์ฉ๋ฌผ์ ๋ฐ๊พธ๋ ๊ฒ.
document.getElementById("msg").innerHTML = ` ${'${msg}'}`;
//ํ๋ฉด ํ์์๋ ํด๋น ์์๊ฐ ์ ํ๋์ด์ ธ ์๋๋ก
if(element) {
element.select();
}
}
</script>
</form>
</body>
6. ์ฝ๋ ๋ฆฌ๋ทฐ(Java/์ฃผ์๋ฌ๊ธฐ)
package com.fastcampus.ch2;
import java.net.URLEncoder;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/login")
public class LoginController {
//์กฐํ๋ง ํ ์์ ๋ก๊ทธ์ธ ์
๋ ฅ์ฐฝ์ ๋ณด์ฌ์ค๋ผ
@GetMapping("/login")
public String loginform() {
return "loginForm";
}
// ๋ด์ฉ์ ์ฐ๊ณ ๋ก๊ทธ์ธ ์์ฒญ(POST)๋ฅผ ํ์์,
@PostMapping("/login")
public String login(String id, String pwd, boolean rememberId, HttpServletResponse response ) throws Exception {
System.out.println("id=" +id);
System.out.println("pwd=" +pwd);
System.out.println("rememberId=" +rememberId);
// 1. id์ pwd๋ฅผ ํ์ธ
if(!loginCheck(id,pwd)) {
String msg=URLEncoder.encode("id ๋๋ pwd๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.", "utf-8");
// 2-1 ์ผ์นํ์ง ์์ผ๋ฉด loginform ์ผ๋ก redirect ์คํธ๋ง ์ฟผ๋ฆฌ๋ก
// ํ๋ฉด์ ๋ณด์ผ ๋ฉ์ธ์ง๋ ๊ฐ์ด ๋ณด๋.
return "redirect:/login/login?msg="+msg;
}
// 2-2 id์ pwd๊ฐ ์ผ์นํ๋ฉด
if(rememberId) {// ์ฟ ํค๋ฅผ ์์ฑ, ์๋ต์ ์ ์ฅ
Cookie cookie = new Cookie("id", id);
response.addCookie(cookie);
} else {// ์ฟ ํค๋ฅผ ์ญ์ , ์๋ต์ ์ ์ฅ
Cookie cookie = new Cookie("id", id);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
// 3. ํ์ผ๋ก ์ด๋
return "redirect:/";
}
private boolean loginCheck(String id, String pwd) {
// ์๋ ๋งค๊ฐ๋ณ์๋ null์ธ์ง ์๋์ง ๊ฒ์ฌ๋ฅผ ํด์ผํ๋๋ฐ
// ๋ฐ์ ์ฒ๋ผ ์ ์ด๋์ผ๋ฉด null check๋ฅผ ํด์ค ํ์๊ฐ ์์.
return "asdf".equals(id) && "1234".equals(pwd);
}
7. ์ค์ค๋ก ํด๋ณด๊ธฐ (๋น๋ฐ๋ฒํธ๋ ์ฟ ํค๊ฐ ๊ธฐ์ตํด์ ๋ก๊ทธ์ธ ์ฌ ๋ฐฉ๋ฌธ ์ ์ฐํ๊ฒ ํ๊ธฐ(HTML๋ ๋ฐ๊พธ๊ธฐ), ์์ด๋ ์ฟ ํค ์ญ์ ํ๊ธฐ )
์ฟ ํค 2๋ก ๋ฐ์ผ๋ ๋น๋ฒ์ ์ ๋ ฅ ์๋ ์ฑ๋ก ๋์๋ค.
๊ทธ๋์ ์ ๋ถ
๋ก ํ๋๋ ๋๋ค.