라벨이 MySQL인 게시물 표시

Node.js Express JWT와 MySQL 로그인 구현: Access·Refresh Token 보안

이 글은 2022년의 Node.js·Express·JWT·MySQL 로그인 기록을 보안 중심의 구현 가이드로 전면 개정한 글입니다. 기존 URL은 유지하지만, 인증서 검증을 끄는 방법과 장기 JWT 하나만 사용하는 구조는 제거했습니다. JWT 로그인 예제는 대개 로그인 성공 후 토큰 하나를 반환하는 데서 끝납니다. 실제 서비스에는 그 뒤의 문제가 더 중요합니다. 토큰이 탈취되면 어떻게 폐기할지, 비밀번호를 어떻게 저장할지, 여러 요청이 동시에 Refresh Token을 재사용하면 어떻게 막을지까지 설계해야 합니다. 이 글에서는 다음 구조를 구현합니다. 비밀번호는 단방향 해시로 저장한다. Access Token은 짧게 유지하고 API 요청에 사용한다. Refresh Token은 충분히 긴 난수로 만들고 원문 대신 해시를 MySQL에 저장한다. 갱신할 때 Refresh Token을 한 번만 사용하고 즉시 회전한다. 브라우저에는 Refresh Token을 HttpOnly , Secure 쿠키로 전달한다. 로그아웃하면 서버 저장소의 토큰을 폐기한다. 먼저 보는 핵심 JWT라는 형식이 세션 폐기 문제를 자동으로 해결하지는 않습니다. 짧은 Access Token과 서버에서 통제하는 회전형 Refresh Token을 함께 사용해야 탈취와 강제 로그아웃에 대응할 수 있습니다. 항목 Access Token Refresh Token 목적 보호된 API 호출 새 Access Token 발급 권장 수명 짧게, 예제는 10분 더 길게, 예제는 14일 저장 위치 앱 메모리 또는 Authorization 헤더 브라우저의 HttpOnly 쿠키 서버 저장 보통 저장하지 않음 원문이 아닌 SHA-256 해시 저장 폐기 만료를 짧게 두거나 별도 차단 목록 DB 행 폐기 또는 삭제 패키지와 환경 변수 예제는 ESM 문법을 사용합니다. bash npm install express mysq...