티스토리 뷰

express.js로 로그인 시스템을 구현할 때 적용할 수 있는 주요 보안 방식들을 아래와 같이 정리해 보았어. 이 방식들을 조합하면 안전한 인증 시스템을 설계할 수 있습니다.


1. 패스워드 보안

  • 해싱(Hashing):
    • 비밀번호는 절대 평문으로 저장하지 말고, 해시 알고리즘(Bcrypt, Argon2 등)을 사용해 안전하게 저장해야 함.
    • bcrypt.js 또는 argon2 라이브러리를 사용.
  • Salting:
    • 같은 비밀번호라도 다른 해시 값을 가지도록 Salt를 추가.

2. 세션 관리 및 쿠키 보안

  • 세션 기반 인증:
    • express-session을 사용해 세션 관리.
    • 서버에서 세션 데이터를 저장하고, 클라이언트는 세션 ID 쿠키만 유지.
  • 쿠키 설정:
    • HttpOnly: 자바스크립트로 쿠키 접근 차단.
    • Secure: HTTPS에서만 쿠키 전달.
    • SameSite: 크로스 사이트 요청 위조(CSRF) 방지.
  • Redis로 세션 저장:
    • 세션 데이터를 connect-redis와 같은 라이브러리를 사용해 Redis에 저장.

3. JWT(Json Web Token) 기반 인증

  • JWT 토큰 사용:
    • 사용자 인증 후 토큰 발급.
    • 토큰에는 민감한 정보를 담지 않고, 필요한 정보만 포함.
  • 서명 키 관리:
    • JWT 서명을 위한 secret key를 안전하게 보관 (환경 변수에 저장).
    • 가능한 RSA와 같은 비대칭 키 암호화 사용.

4. CSRF(Cross-Site Request Forgery) 방지

  • CSRF 토큰:
    • csurf 미들웨어를 사용해 CSRF 공격을 방지.
    • 각 요청에 CSRF 토큰 포함.

5. Rate Limiting(요청 제한)

  • Brute Force 방지:
    • express-rate-limit 라이브러리를 사용해 특정 IP의 로그인 시도 횟수를 제한.
    • Captcha 추가도 유효.

6. HTTPS 사용

  • 모든 요청을 HTTPS로 강제 리다이렉트.
  • SSL/TLS 인증서를 적용.

7. 입력 데이터 검증 및 방어

  • SQL Injection 방지:
    • ORM/Query Builder 사용 (Sequelize, TypeORM 등).
    • 쿼리 시 파라미터 바인딩을 활용.
  • XSS 방지:
    • 사용자 입력 데이터에 대해 HTML 이스케이프 처리 (xss-clean 라이브러리).

8. 2단계 인증 (2FA)

  • OTP(One Time Password):
    • Google Authenticator나 Authy와 같은 앱 사용.
  • SMS/Email 인증:
    • 로그인 시 추가 코드 전송.

9. 로그 및 모니터링

  • 로그 기록:
    • winston 또는 morgan으로 중요한 이벤트(로그인 시도, 실패 등) 기록.
  • 이상 행동 감지:
    • 비정상적인 로그인 시도 시 알림 또는 차단.

10. 환경 변수 사용

  • 민감한 정보(DB URL, JWT Secret, API Key)는 .env 파일에 저장하고, dotenv로 불러오기.

이 방법들 중 패스워드 보안세션 관리/쿠키 보안은 기본적으로 적용해야 하고, JWT, 2FA 등은 필요에 따라 확장적으로 적용하면 좋습니다.

댓글