v3
★ PART · BOARD

안전한 회원가입/로그인

회원과 게시판 — 읽기 자료

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

핵심 용어

BCrypt단방향 해시 알고리즘. 복호화 불가.
단방향 해시평문 → 해시는 가능, 그 반대는 불가능.

1. 문제

v2 의 두 문제 + 컬럼 길이

① 평문 저장 ② 무상태 — 그리고 v2 의 pwd VARCHAR(20) 으론 BCrypt 60자 해시가 안 들어감.

2. 새 도구

ALTER TABLE + BCrypt + HttpSession

먼저 컬럼 길이를 늘리고, v2 코드에 두 줄을 추가·교체해서 안전한 v3 로 진화.

3. 코드

-- 1) 스키마 마이그레이션 (BCrypt 60자 수용)
ALTER TABLE mymember MODIFY COLUMN pwd VARCHAR(100) NOT NULL;
-- 기존 평문 데이터는? 학습용이라 비우고 다시 가입.

// 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:/";
    }
}

4. 정리

5. Before / After

전 차시 끝

v2 의 두 문제 — 평문, 무상태 — 를 해결할 시간.

이번 차시 끝

평문 사라짐 + 세션으로 로그인 유지. v3 마일스톤.