의도적으로 위험한 첫 버전
v3 에서 BCrypt + 세션을 도입할 때 — 그 도구가 「왜 좋은지」 가 머리에 박히려면, 도구 없는 상태의 답답함을 직접 겪어봐야 합니다.
v2 는 일부러 위험. v3 가 그 위험을 푸는 모습을 다음 차시에서.
CREATE TABLE mymember (
id VARCHAR(50) PRIMARY KEY,
pwd VARCHAR(20) NOT NULL
);
👉 pwd VARCHAR(20) — 평문 비밀번호엔 충분. 하지만 v3 에서 BCrypt 도입 시 이 길이가 문제.
package com.smhrd.service;
@Service
public class MemberService {
@Autowired private MemberMapper mapper;
// ⚠️ 평문 그대로 저장 (의도적 위험)
public void signup(Member m) {
mapper.insert(m); // pwd 변환 없이 그대로
}
}
-- DB 의 결과
SELECT id, pwd FROM mymember;
id | pwd
--------+----------
hong | mypw1234 ← 평문 그대로!
kim | secret999
👉 v3 에서 BCrypt 단방향 해시로 해결.
public Member login(String id, String pwd) {
Member m = mapper.selectOne(id);
if (m != null && m.getPwd().equals(pwd)) {
return m; // 단순 문자열 비교
}
return null;
}
👉 BCrypt 같은 해시 비교 X. 단순 String.equals().
@PostMapping("/login")
public String login(@RequestParam String id,
@RequestParam String pwd) {
Member m = service.login(id, pwd);
if (m == null) {
return "redirect:/login?error";
}
return "redirect:/";
// ⚠️ session.setAttribute 안 함!
}
로그인은 성공하지만 — 다른 페이지로 이동하면 「누구였는지」 모름. 모든 페이지가 비로그인 상태.
v2 는 학습용 일회성 단계입니다. 실제 서비스에선 절대 사용 X.
회원가입 폼은 만들었지만 인증 흐름 전체는 미완성.
위험한 인증이 작동한다. 두 가지 문제 (평문 / 무상태) 를 직접 체감.
다음: 쿠키 깊이 보기 → 세션 깊이 보기 → ★ v3 안전 인증.