โ๊ณต๋ถํ๊ฒ ๋ ๊ณ๊ธฐ
Spring Boot ์ค์ต (๋ง์ด๋ฐํฐ์ค, ๋น์ค์ฝํ, ์ธํฐ์ ํฐ part) ์์ ๋น์ค์ฝํ์ ๋ํด ํ์ตํ๋ ์ค ์ธ์ ์ ํตํด ๋ก๊ทธ์ธ ํ์ธ ๋ฐ ์ ๋ณด ํ์ธ์ ๋ํด ๋ค๋ฃจ์๋๋ฐ, ์ธ์ ๊ณผ ์ธ์ ์ ์๋ ค๋ฉด ๋ฐ๋์ ์์์ผํ๋ ๊ฐ๋ ์ธ ์ฟ ํค์ ๋ํด ์ข ๋ ์์ธํ ์๊ณ ๋์ด๊ฐ๊ณ ์ถ์ด์ ์ ๋ฆฌํ๊ณ ์ ํ๋ค. (+ ๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ)
โ๏ธ๊ณต๋ถํ ๋ด์ฉ
1๏ธโฃ ์ธ์ ๊ณผ ์ฟ ํค๋ฅผ ํ์ฉํ๋ ์ด์
โก๏ธ HTTP ์ ํน์ฑ (๋น์ฐ๊ฒฐ์ฑ & ๋น์ํ์ฑ) ์ ๋ณด์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
โ ๋น์ฐ๊ฒฐ์ฑ (Connectionless Protocol)
โก๏ธ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ํ์ ๋, ๊ทธ ์์ฒญ์ ๋ง๋ ์๋ต์ ๋ณด๋ธ ํ ์ฐ๊ฒฐ์ ๋๋ ์ฒ๋ฆฌ๋ฐฉ์ (Request ↔๏ธ Response)
โก ๋น์ํ์ฑ (Stateless Protocol)
โก๏ธ ์ปค๋ฅ์ ์ ๋๋ ์๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ํต์ ์ด ๋๋๋ฉฐ ์ํ ์ ๋ณด๋ ์ ์งํ์ง ์๋ ํน์ฑ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ฒซ๋ฒ์งธ ํต์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์๋คํด๋, ๋๋ฒ์งธ ํต์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ง ํ์ง ์๋๋ค. But ํ์๋กํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด๋ฌํ ํน์ฑ์ผ๋ก ์ธํด ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ํต์ ์ ๋น์ฐ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ๋ง์ฝ ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ๋งค๋ฒ ์ธ์ฆํด์ฃผ์ด์ผํ๋๋ฐ ์ด๋ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด๋ฏ๋ก ์ฟ ํค์ ์ธ์ ์ ํตํด ์ด๋ฅผ ๊ฐํธํ ํ๋ค.
2๏ธโฃ ์ฟ ํค (Cookie)
โก๏ธ HTTP ์ ์ผ์ข ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ด๋ค ์น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ, ๊ทธ ์ฌ์ดํธ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ์๋ฒ์์ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ ์ฅํ๋ ๊ธฐ๋ก ์ ๋ณด ํ์ผ๋ก, HTTP ์์ ํด๋ผ์ด์ธํธ์ ์ํ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ์ PC ์ ์ ์ฅํ์๋ค๊ฐ ํ์์ ์ ๋ณด๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์ฌ์ฌ์ฉ ํ ์ ์๋ค.
โ ํํ
โก๏ธ Key ์ Value ๋ก ๊ตฌ์ฑ๋๊ณ , String ํํ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
โก ์ฌ์ฉ๋ชฉ์
- ์ธ์ ๊ด๋ฆฌ (Session Management) : ๋ก๊ทธ์ธ, ์ฌ์ฉํ ๋๋ค์, ์ ์์๊ฐ, ์ฅ๋ฐ๊ตฌ๋ ๋ฑ์ ์๋ฒ๊ฐ ์์์ผํ ์ ๋ณด๋ค์ ์ ์ฅ
- ๊ฐ์ธํ (Persionalization) : ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅด๊ฒ ๊ทธ ์ฌ๋์๊ฒ ์ ์ ํ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค
- ํธ๋ ํน (Tracking) : ์ฌ์ฉ์์ ํ๋๊ณผ ํจํด์ ๋ถ์ํ๊ณ ๊ธฐ๋ก
โก ํน์ง
- ์ด๋ฆ, ๊ฐ, ๋ง๋ฃ์ผ(์ ์ฅ๊ธฐ๊ฐ), ๊ฒฝ๋ก ์ ๋ณด๋ก ๊ตฌ์ฑ
- ํด๋ผ์ด์ธํธ์ ์ด 300๊ฐ์ ์ฟ ํค๋ฅผ ์ ์ฅ ๊ฐ๋ฅ
- ํ๋์ ๋๋ฉ์ธ ๋น 20๊ฐ์ ์ฟ ํค๋ฅผ ๊ฐ์ง ์ ์์
- ํ๋์ ์ฟ ํค๋ 4KB ๊น์ง ์ ์ฅ ๊ฐ๋ฅ
โข ๋์ ์์
- ํด๋ผ์ด์ธํธ๊ฐ ํ์ด์ง๋ฅผ ์์ฒญํ๋ค. (์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์น์ฌ์ดํธ์ ์ ๊ทผ โก๏ธ ์๋ฒ์ ์์ฒญ)
- ์น ์๋ฒ๋ ์ฟ ํค๋ฅผ ์์ฑํ๋ค.
- ์์ฑํ ์ฟ ํค์ ์ ๋ณด๋ฅผ ๋ด์ HTTP ํ๋ฉด์ ๋๋ ค์ค ๋, ๊ฐ์ด ํด๋ผ์ด์ธํธ์๊ฒ ๋๋ ค์ค๋ค.
- ๋๊ฒจ๋ฐ์ ์ฟ ํค๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ณ ์๋ค๊ฐ ๋ค์ ์๋ฒ์ ์์ฒญํ ๋ ์์ฒญ๊ณผ ํจ๊ป ์ฟ ํค๋ฅผ ์ ์กํ๋ค.
- ๋์ผ ์ฌ์ดํธ์ ์ฌ๋ฐฉ๋ฌธ ์ ํด๋ผ์ด์ธํธ์ PC์ ํด๋น ์ฟ ํค๊ฐ ์๋ ๊ฒฝ์ฐ, ์์ฒญ ํ์ด์ง์ ํจ๊ป ์ฟ ํค๋ฅผ ์ ์กํ๋ค.
โฃ ์ฌ์ฉ ์์
- ID ์ ์ฅ, ๋ก๊ทธ์ธ ์ํ ์ ์ง
- ์ผ์ฃผ์ผ๊ฐ ๋ค์ ๋ณด์ง ์๊ธฐ
- ์ต๊ทผ ๊ฒ์ํ ์ํ๋ค ํ์ธ & ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ํ ์ถ์ฒ ์๋น์ค ์ ๊ณต
- ์ผํ๋ชฐ ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ
โค ๋จ์
- ๋ฐฉ๋ฌธ ์น ์ฌ์ดํธ์ ๋ํ ์ ๋ณด ๋ฐ ๊ฐ์ธ ์ ๋ณด๊ฐ ๊ธฐ๋ก๋๋ฏ๋ก ์ ๋ณด๊ฐ ๋ ธ์ถ๋จ. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฟ ํค ๊ฑฐ๋ถ ๊ธฐ๋ฅ์ด ์กด์ฌ. But ์ฟ ํค์ ๋ํ ๊ฑฐ๋ถ๊ฐ ์ค์ ๋์ด์์ผ๋ฉด, ์ฟ ํค์ ๋ณธ๋ ๋ชฉ์ ์ธ ์ฐ์์ ์ธ ์ฐ๊ฒฐ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์
- ์๋ฒ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์๋๋ผ ์ฌ์ฉ์์๊ฒ ์ ์ฅ๋๊ธฐ ๋๋ฌด์, ์์๋ก ๊ณ ์น๊ฑฐ๋ ์ง์ธ ์ ์๊ณ , ๊ฐ๋ก์ฑ๊ธฐ๋ก ์ฌ์ ๋ณด์์ด ์ทจ์ฝ. ๋ฐ๋ผ์ ์ฟ ํค์๋ ๋ฏผ๊ฐํ๊ฑฐ๋ ์ค์ํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฒ์ ์ํํจ
โก๏ธ ์ฟ ํค์ ์ด๋ฌํ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ๊ฒ์ด ๋ฐ๋ก "์ธ์ (Session)" ์ด๋ค.
3๏ธโฃ ์ธ์ (Session)
โก๏ธ ์ผ์ ์๊ฐ(= ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์น ์๋ฒ์ ์ ์ํ ์์ ๋ถํฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํ์ฌ ์ฐ๊ฒฐ์ ๋๋ด๋ ์์ ) ๋์ ๊ฐ์ ์ฌ์ฉ์ (๋ธ๋ผ์ฐ์ ) ๋ก ๋ถํฐ ๋ค์ด์ค๋ ์ผ๋ จ์ ์๊ตฌ๋ฅผ ํ๋์ ์ํ๋ก ๋ณด๊ณ , ๊ทธ ์ํ๋ฅผ ์ ์ง์ํค๋ ๊ธฐ์ ๋ก, ์ฌ์ฉ์๊ฐ ์น ์๋ฒ์ ์ ์ํด ์๋ ์ํ๋ฅผ ํ๋์ ๋จ์๋ฅผ ์ธ์ ์ด๋ผ๊ณ ํ๋ค.
โ ํน์ง
- ๊ฐ ํด๋ผ์ด์ธํธ์ ๊ณ ์ ํ Session ID ๋ฅผ ๋ถ์ฌํ๋ค. Seesion ID ๋ก ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ๋ถํด ์๊ตฌ์ ๋ง๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ ์น ๋ธ๋ผ์ฐ์ ๋น 1๊ฐ์ฉ ์์ฑ๋์ด ์น ์ปจํ
์ด๋์ ์ ์ฅ๋๋ฉฐ ๋ธ๋ผ์ฐ์ ์ข
๋ฃ์ ์๋ฉธ๋๋ค. (+ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ๋ํด์๋ง ์ธ์
์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ๋ก๊ทธ์์ํ๋ฉด ์๋ก์ด ์ฌ์ฉ์๋ก ์ธ์ํด์ ์๋ก์ด ์ธ์
์ด ์์ฑ๋๋ค.)
โก๏ธ ์์ด๋, ๋๋ค์ ๋ฑ์ ์ ๋ณด๋ฅผ ์ธ์ ์ ๋ด์๋๋ฉด ์์ฒญ์ด ์์ ๋๋ง๋ค DB์ ์ ๊ทผํ ํ์๊ฐ ์์ด์ ํจ์จ์ ์ด๋ค. - ์น ์๋ฒ์ ์ ์ฅ๋๋ ์ฟ ํค๋ฅผ "์ธ์ ์ฟ ํค" ๋ผ๊ณ ํ๋ค.
- ์๋ฒ ์ฉ๋์ด ํ์ฉํ๋ ์์์ ์ ์ฅ ๋ฐ์ดํฐ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โก ๋์ ์์
- ํด๋ผ์ด์ธํธ๊ฐ ํ์ด์ง์ ์์ฒญํ๋ค. (์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์น์ฌ์ดํธ์ ์ ๊ทผ โก๏ธ ์๋ฒ์ ์์ฒญ)
- ์๋ฒ๋ ์ ๊ทผํ ํด๋ผ์ด์ธํธ์ Request-Header ํ๋์ธ Cookie ๋ฅผ ํ์ธํ์ฌ, ํด๋ผ์ด์ธํธ๊ฐ ํด๋น Session ID ๋ฅผ ๋ณด๋๋์ง ํ์ธํ๋ค.
- Session ID ๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์์ฑํด ํด๋ผ์ด์ธํธ์๊ฒ ๋๋ ค์ค๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋๋ ค์ค Session ID ๋ฅผ ์ฟ ํค๋ฅผ ์ฌ์ฉํด ์น ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ์ ์ฅ์์ ์ ์ฅํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ฌ์ ์ ์, ์ฟ ํค๋ฅผ ์ด์ฉํด Session ID ๊ฐ์ ์๋ฒ์ ์ ๋ฌํ๊ณ , ์๋ฒ์์๋ ์ฟ ํค์ ์๋ฒ์ ์ ์ฅ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋น๊ตํ์ฌ ๊ฐ์ ์ฌ์ฉ์์์ ํ์ธํ๋ค.
โ๏ธ ์ ์ฉ ์์ผ๋ณธ ์์
โก๏ธ ๋ก๊ทธ์ธ ์ฑ๊ณต ์ Controller ์์ Session ์ "loginedMemberId" ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ธํฐ์ ํฐ๋ฅผ ์คํ์์ผ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ ์์ฑํด๋ณด์๋ค.
- Controller : ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ธ์ ์ "loginedMemberId" ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅ
@Controller
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
private final MemberService memberService;
private final Rq rq;
@PostMapping("/login")
public String login(String username, String password, HttpSession session ) {
Member member = memberService.getMemberByUsername(username);
if (member == null) {
return "redirect:/?msg=NotFoundMember";
}
if (!member.matchPassword(password)) {
return "redirect:/?msg=passwordError";
}
// login ๊ด๋ จ ์ธํฐ์
ํฐ์๊ฒ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ ๋ฌ
// ๋จ์ํ logined ์ T/F ๋ฅผ ๋ณด๋ด๋ฉด ๋ก๊ทธ์ธํ ์ ์ ๊ฐ ๋๊ตฐ์ง ์ ์ ์์
session.setAttribute("loginedMemberId", member.getId());
rq.setName(member.getName());
return "redirect:/?msg=loginSuccess";
}
}
- ์ธ์ ์ ์ ์ฅ๋ "loginedMemberId" ์ ๋ณด ํ์ธ์ ํตํ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋๊ตฌ
@Component // Bean ๋ฑ๋ก
@RequestScope // ๋ธ๋ผ์ฐ์ ๋น 1๊ฐ
@RequiredArgsConstructor
public class Rq {
private final HttpSession session;
public long getLoginedMemberId() {
Long id = (Long) session.getAttribute("loginedMemberId");
if (id == null) {
return -1;
}
return id;
}
public boolean isLogined() {
return getLoginedMemberId() >= 0;
}
public boolean isLogout() {
return isLogined() == false;
}
}
- Interceptor : ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์คํ๋๋ฉฐ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธ
@Configuration
@RequiredArgsConstructor
@Slf4j
public class NeedToLoginInterceptor implements HandlerInterceptor {
private final Rq rq;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(!rq.isLogined()) {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.getWriter().append("๋ก๊ทธ์ธ ํ ์ด์ฉ๋ฐ๋๋๋ค.");
return false; // Controller ์ง์
๋ชปํด๋ณด๊ณ ์ข
๋ฃ๋จ
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
๐ง ์ถ๊ฐ๋ก ๊ถ๊ธํ ์
๐ ์ฐธ๊ณ
[web] ์ฟ ํค(cookie)์ ์ธ์ (session)์ ๊ฐ๋ /์ฐจ์ด/์ฉ๋/์๋๋ฐฉ์
[web] ์ฟ ํค(cookie)์ ์ธ์ (session)์ ๊ฐ๋ /์ฐจ์ด/์ฉ๋/์๋ ์ฟ ํค์ ์ธ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ ๋จผ์ http์ ํน์ง์ ๋ํด ์ดํดํ๋ฉด ๋์์ด ๋ฉ๋๋ค. ๋น์ฐ๊ฒฐ์ฑ(Connectionless) HTTP(Hypertext Transfer Protocol)๋ ์ธํฐ
devuna.tistory.com
์ฟ ํค(Cookie)์ ์ธ์ (Session)์ ์ฐจ์ด (+์บ์(Cache))
์ฟ ํค์ ์ธ์ ์ ์ฌ์ฉํ๋ ์ด์ ? HTTP ํ๋กํ ์ฝ์ ํน์ง์ด์ ์ฝ์ ์ ๋ณด์ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค. HTTP ํ๋กํ ์ฝ์ ํน์ง 1. Connectionless ํ๋กํ ์ฝ (๋น์ฐ๊ฒฐ ์งํฅ) ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ(Request)์ ํ์
dev-coco.tistory.com