v3
★ LAB · BOARD

안전한 회원가입/로그인

회원과 게시판 — 실습

📍 지금 어디를 만지고 있나요?
브라우저
회원과 게시판
DB

사전 준비

이번 실습의 목표

v2 코드에 두 줄을 추가·교체해서 안전한 v3 로 진화.

1
스키마 마이그레이션 — pwd 길이 늘리기
-- v2 의 pwd VARCHAR(20) 으론 BCrypt 60자 해시가 안 들어감
ALTER TABLE mymember MODIFY COLUMN pwd VARCHAR(100) NOT NULL;

-- 기존 평문 데이터는?
-- 학습 단계라 비우고 다시 가입:
TRUNCATE TABLE mymember;
CHECKPOINT
  • DESC mymember; 에서 pwd 가 varchar(100) 으로 보이는가?
2
코드 — BCrypt + HttpSession
// com.smhrd.service.MemberService
@Service
public class MemberService {
    @Autowired MemberMapper mapper;

    private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

    public void signup(Member m) {
        m.setPwd(encoder.encode(m.getPwd()));   // ← BCrypt!
        mapper.insert(m);
    }

    public Member login(String id, String pwd) {
        Member m = mapper.selectOne(id);
        if (m != null && encoder.matches(pwd, m.getPwd())) {
            return m;
        }
        return null;
    }
}

// com.smhrd.controller.LoginController
@Controller
public class LoginController {
    @PostMapping("/login")
    public String login(@RequestParam String id,
                         @RequestParam String pwd,
                         HttpSession session) {
        Member m = service.login(id, pwd);
        if (m != null) {
            session.setAttribute("loginUser", m);    // ← 세션!
            return "redirect:/";
        }
        return "redirect:/login?error";
    }

    @GetMapping("/logout")
    public String logout(HttpSession session) {
        session.invalidate();
        return "redirect:/";
    }
}
CHECKPOINT
  • 코드를 작성한 뒤 빨간 줄(컴파일 오류)이 없는가?
3
실행 + 결과 확인

회원가입 → DB SELECT → 로그인 → 페이지 이동 순서로 따라갑니다.

CHECKPOINT
  • SELECT id, pwd FROM mymember; — pwd 가 $2a$10$... 형태(60자)인가?
  • F12 → Application → Cookies 에 JSESSIONID 가 있는가?
  • 로그인 후 다른 페이지로 이동해도 상태 유지되는가?

실습 완료 체크리스트

BCrypt = 단방향 해시
session.setAttribute 으로 로그인 유지
invalidate() 로 로그아웃
v3 — 실용 가능한 첫 인증