[Node.js] Authentication 탐구(Bcrypt와 JWT)

[Node.js] Authentication 탐구(Bcrypt와 JWT)

Node.js에서 인증을 구현하는 두 가지 방식: Bcrypt와 JWT 🔐


Node.js에서 로그인 기능을 구현하기 위해 로그인 보안 인증에 관련하여 공부해봤다.
그 중에서 Bcrypt와 JWT 방식을 봤으며 해당 인증 방식의 대하여 포스팅을 한다

1. Bcrypt란 무엇인가? 🤔

bcrypt.png

Bcrypt는 패스워드를 안전하게 저장하기 위한 암호화 라이브러리이다. 일반적으로 사용자의 비밀번호를 데이터베이스에 저장할 때 암호화를 하지 않으면, 데이터 유출 시 매우 큰 피해로 이어질 수 있다. 따라서 Bcrypt를 통해 비밀번호를 해시하여 저장하는 것은 보안에서 필수적이다. 해시된 비밀번호는 원래의 텍스트 비밀번호로 쉽게 되돌릴 수 없으며, 이는 비밀번호 보안을 강화하는 핵심이다.

  • Bcrypt 사용 흐름:
    1. 사용자가 회원가입을 할 때 비밀번호를 입력한다.
    2. 입력된 비밀번호를 bcrypt로 해싱하여 데이터베이스에 저장한다.
    3. 사용자가 로그인을 시도할 때, 입력된 비밀번호를 다시 해싱한 후 데이터베이스에 저장된 값과 비교한다.

2. JWT (JSON Web Token)란 무엇인가? 📝

jwt.png

JWT는 사용자 인증에 사용되는 토큰 기반 인증 방식이다. JWT는 서버와 클라이언트 간의 인증 정보를 안전하게 주고받기 위한 표준으로, 주로 사용자 인증 후 토큰을 발급하고 이를 통해 이후 요청에서 인증을 수행한다. JWT는 사용자에 대한 정보를 포함하는 토큰으로, 주로 헤더(header)페이로드(payload)서명(signature) 세 부분으로 구성된다.

  • JWT 사용 흐름:
    1. 사용자가 로그인 요청을 하면, 서버는 사용자를 인증하고 JWT를 생성한다.
    2. 이 JWT를 클라이언트 측에 전달하고 클라이언트는 이를 로컬 스토리지나 쿠키에 저장한다.
    3. 이후 API 요청마다 JWT를 헤더에 포함하여 서버로 보내며, 서버는 해당 JWT를 검증하여 사용자를 인증한다.

3. Bcrypt와 JWT의 차이점 🚧

이제 Bcrypt와 JWT의 차이점을 구체적으로 살펴보자.

🔍 항목 🧂 Bcrypt 🪙 JWT
목적 비밀번호 해시화 및 보관 사용자 인증 후 토큰 발급 및 관리
사용 방식 주로 비밀번호를 암호화하여 데이터베이스에 저장함 클라이언트-서버 간 상태를 유지하기 위해 토큰 발급
보안 수준 비밀번호의 보안성을 강화 토큰에 포함된 정보의 무결성 보장
저장 방법 데이터베이스에 해시된 비밀번호를 저장 클라이언트 측에 토큰을 저장 (로컬 스토리지, 쿠키 등)

4. Bcrypt와 JWT의 장단점 비교 ⚖️

📌 Bcrypt의 장점 👍

  1. 높은 보안성: 비밀번호는 원래의 형태로 복구가 불가능하게 해싱되기 때문에 유출되더라도 안전성이 높다.
  2. 비밀번호 해싱의 강도: Bcrypt는 비용 인자(cost factor)를 사용하여 해싱의 강도를 조절할 수 있다. 이를 통해 비밀번호 해싱 과정이 복잡해져 무차별 대입 공격으로부터 안전하다.

📌 Bcrypt의 단점 👎

  1. 고비용 연산: 해싱 과정이 복잡하기 때문에 많은 리소스를 사용하며, 이에 따라 속도가 느려질 수 있다.
  2. 단순 비밀번호 관리: 인증 상태를 유지하는 역할은 불가능하고, 단지 비밀번호 관리에만 국한되어 있다.

📌 JWT의 장점 👍

  1. 상태 비유지(stateless): 서버에서 세션을 유지할 필요가 없어 서버의 리소스를 절약할 수 있다.
  2. 확장성: 다양한 플랫폼에서 인증을 처리하는 데 적합하며, 모바일 앱과 웹 애플리케이션 간의 인증을 일관성 있게 처리할 수 있다.

📌 JWT의 단점 👎

  1. 보안 취약점: 토큰이 탈취되면 만료 전까지 사용자가 아닌 사람이 토큰을 사용하여 인증된 것처럼 행동할 수 있다.
  2. 토큰 크기 문제: JWT는 클라이언트에서 전송될 때마다 일정한 크기를 차지하기 때문에 네트워크 사용량이 증가할 수 있다.

5. 언제 Bcrypt를 사용하고, 언제 JWT를 사용할까? 🤔💡

Bcrypt와 JWT는 목적이 다르기 때문에 상황에 따라 적절히 사용해야 한다. 회원가입이나 비밀번호 변경 기능에서 비밀번호를 안전하게 관리하기 위해 Bcrypt를 사용하는 것이 좋다. 반면, 사용자가 로그인한 후 클라이언트와 서버 간 인증을 위한 간편한 방식이 필요하다면 JWT가 유용하다.

  • Bcrypt는 비밀번호를 안전하게 저장하고, 로그인 시 사용자 인증을 위한 비밀번호 비교 과정에 사용한다.
  • JWT는 사용자가 로그인한 후 인증 상태를 유지하는 데 사용되며, 클라이언트 측에서 토큰을 저장하고 이를 통해 추가적인 인증 절차를 수행할 수 있다.

6. 결론 🏁

Node.js에서 사용자 인증을 구현할 때 Bcrypt와 JWT는 각자의 역할과 목적을 가지고 있다. Bcrypt는 비밀번호의 안전한 저장을, JWT는 로그인 이후의 인증 상태 유지를 담당하는 것이다. 이 두 가지를 결합하여 비밀번호를 안전하게 관리하면서 사용자 인증 상태를 효율적으로 처리하는 것이 일반적인 방식이다.

  • 회원가입 시: 비밀번호를 Bcrypt로 해싱하여 저장한다.
  • 로그인 시: 비밀번호를 Bcrypt로 검증한 후, JWT를 생성하여 사용자에게 전달한다.
  • 인증 상태 유지: 클라이언트는 이후 API 호출 시 JWT를 사용하여 인증을 유지한다.

이러한 인증 방식을 통해 더 안전하고 확장성 있는 인증 시스템을 구축할 수 있다. Node.js 환경에서 이러한 방식을 잘 조합하면 보안성과 효율성을 모두 확보할 수 있을 것이다. 🌟

댓글