💡 오늘은 로그인 인증 시 많이 사용되는 기술인 JWT와 비밀번호 암호화에 대해 요약해보자. 문득 회원 기능을 맡다가 로그인 기능을 구현할 때 왜 JWT를 사용하고, 비밀번호를 어떻게 안전하게 저장하는지 궁금해져서 이렇게 간단하게 정리해본다.
JWT는 JSON 데이터를 서명하여 변조를 방지하고, 사용자의 인증 및 권한을 확인하는 토큰 기반 인증 기술이다.
JWT는 3가지로 구성된다.
Header(헤더)
, Payload(페이로드)
, Signature(서명)
➡️ Header.Payload.Signature
Header
: 토큰의 타입과 서명 알고리즘 정보가 포함
Payload
: 인증된 사용자 정보(예: userId, role)를 포함
👉 중요! 민감한 정보는 넣지 말아야 한다.
Signature
: 토큰이 변조되지 않았음을 검증하는 서명
Stateless
: 서버가 사용자 상태를 저장하지 않음
변조 방지
: 서명을 통해 데이터 변조 여부를 확인할 수 있음
유효기간
: 토큰에 만료 시간을 설정할 수 있음
비밀번호는 평문 그대로 데이터베이스에 저장하면 안된다. 해킹 시 비밀번호가 그대로 노출되기 때문이다. 여기서 등장하는 것이 비밀번호 해싱이다.
Bcrypt는 비밀번호를 안전하게 저장하기 위한 단방향 해싱 알고리즘이다.
Salt(랜덤 문자열)를 추가해 보안을 높이고, 동일한 비밀번호라도 서로 다른 해시값을 생성한다.
비밀번호 저장 시
: 사용자가 입력한 비밀번호를 Bcrypt로 해싱하며, 해싱된 비밀번호를 데이터베이스에 저장한다.
로그인 시 비밀번호 확인
: 사용자가 입력한 비밀번호를 같은 해싱 알고리즘으로 변환하고, 데이터베이스에 저장된 해시값과 일치하는지 확인한다.
단방향 해시
: 해싱된 비밀번호는 복구할 수 없습니다.
Salt 사용
: 같은 비밀번호라도 해시값이 서로 다르게 생성됩니다.
보안 강화
: Brute-force 공격(무작위 대입)으로부터 안전합니다.
로그인 인증 시 JWT와 Bcrypt를 어떻게 사용해야 할까?
1. 회원가입 과정
사용자가 비밀번호를 입력하면 Bcrypt로 비밀번호를 해싱
해싱된 비밀번호를 데이터베이스에 저장
2. 로그인 과정
사용자가 아이디/비밀번호를 입력
서버는 데이터베이스에서 해싱된 비밀번호와 비교해 검증
검증에 성공하면 JWT 토큰을 발급해 클라이언트에 반환
클라이언트는 이후 요청 시 JWT 토큰을 헤더에 실어 보냄
서버는 토큰을 검증해 사용자의 인증 여부를 확인
https://bcrypt-generator.com/ ⬅️ ( 요기 링크 첨부합니다 )
위와 같이 암호화된 비밀번호를 Decrypt 확인함으로써 확인이 가능하다.
구분 | JWT (JSON Web Token) | Bcrypt |
---|---|---|
목적 | 인증 및 권한 부여 | 비밀번호 암호화 및 검증 |
작동 원리 | JSON 데이터를 서명하여 변조 여부 확인 | 비밀번호를 단방향 해싱 후 저장 |
사용 시점 | 로그인 후 사용자 인증 및 요청 처리 | 비밀번호를 저장하거나 입력값 검증 시 사용 |
보안 | 변조 방지 (서명 검증), 암호화는 아님 | 단방향 해시, Salt를 통해 보안 강화 |
Bcrypt
는 비밀번호를 안전하게 저장 및 검증하는 데 사용 !!!!!JWT
는 로그인 후 사용자 인증 및 권한 부여를 위해 사용 !!!!!