1단계: 비밀번호 해시와 JWT 로그인
1단계: 비밀번호 해시와 JWT 로그인
로그인 기능을 밑바닥부터 만듭니다. 비밀번호를 PBKDF2 로 소금 쳐서 저장하고, 로그인 성공 시 JWT 를 HS256/RS256 으로 직접 서명해 발급하고, 보호 자원에서 Bearer 토큰을 검증하고 권한을 확인합니다. 페이로드 변조·alg=none·만료·키 혼동 공격을 직접 시도해 검증 코드가 막는 것을 확인하고, 계정 잠금과 응답 시간 균일화까지 넣습니다. 전부 순수 JDK 이며, 마지막에 jjwt 와 Spring Security 가 각 부분을 어떻게 대신하는지 대응표로 정리합니다.
1. 왜 배우는가
인증은 모든 업무 시스템의 첫 화면이고, 잘못 만들면 다른 모든 기능이 무의미해집니다. 그런데 대부분의 개발자는 Spring Security 설정 몇 줄과 jjwt 호출 몇 줄로 로그인을 "붙이기만" 하고, 그 아래에서 무슨 일이 일어나는지 모릅니다. 그래서 "토큰이 왜 401 이 나는지", "비밀번호 정책을 올리면 기존 사용자는 어떻게 되는지", "alg=none 취약점이 우리 코드에 해당되는지" 같은 질문에 답을 못 합니다.
이 레벨(인증·로그인)은 세 단계로 로그인 기능을 완성합니다.
| 단계 | 내용 | 실무 대응 |
|---|---|---|
| 1단계 (지금 이 레슨) | 비밀번호 해시, JWT 발급·검증, Bearer 보호 자원, 권한, 계정 잠금 | Spring Security + jjwt |
| 2단계 | Access/Refresh 토큰 분리와 회전, OAuth2 인가 코드 + PKCE (소셜 로그인) | spring-security-oauth2-client / authorization-server |
| 3단계 | 2FA(TOTP), 백업 코드, 전체 흐름 통합 | 커스텀 필터, SAML SSO |
실무 프로젝트(icr)는 Spring Security + jjwt 0.12.6 으로 무상태 JWT 인증을 하고, SAML SSO 필터를 얹어 사내 계정 연동을 합니다. 이 레슨의 AuthServer 는 그 필터 체인이 하는 일을 한 파일에 펼쳐 놓은 것입니다.
코드는 java-src/auth/01_jwt_login 에 있고 자바 파일 6개, 외부 jar 없이 실행됩니다. Main --serve 로 8080 포트에 서버만 띄워 브라우저나 curl 로 직접 호출해 볼 수도 있습니다.