해시를 해야 하는 이유
악의적인 사용자가 데이터에 침입하려고 시도하는 시나리오를 고려해야 하므로 모든 비밀번호는 데이터베이스에 입력하기 전에 해시 처리해야 합니다. 비밀번호는 다른 사람이 보지 않기를 바라는 민감한 정보입니다.
이제 암호화를 해싱과 혼동하지 마세요. 무언가를 암호화하면 나중에 해독할 수 있다고 가정합니다. 일반 텍스트로 남겨두는 것보다는 낫지만, 우리가 진정으로 원하는 것은 해독할 수 없는 것입니다. 이것이 해싱이 우리에게 제공하는 것입니다.
Bcrypt로 해싱하기
이 예제에서는 더 많이 사용되는 bcryptjs 라이브러리를 사용할 수 있습니다. 그러나 규칙은 다른 표준 Bcrypt 라이브러리와 동일한 규칙을 따릅니다. 해시할 문자열을 전달하고 보통 솔트도 함께 전달합니다.
예를 들어 bcryptjs 문서에 따라 다음과 같은 작업을 수행합니다:
1 2 3 4 5 |
var bcrypt = require("bcryptjs"); var 소금 = bcrypt.genSaltSync(10); var 해시 = bcrypt.해시싱크("내 비밀번호", 소금); |
이렇게 생성된 해시는 사람이 읽을 수 없으므로 데이터베이스에 저장해도 안전하지 않습니다. 하지만 사용자 로그인을 구현해야 하는 시나리오에서 비밀번호를 어떻게 비교할 수 있을까요?
저장된 비밀번호에 대한 유효성 검사
Bcrypt 라이브러리에는 항상 일반 텍스트 비밀번호와 해시를 비교하는 함수가 있습니다. 사용자 로그인 시나리오에서 비밀번호의 유효성을 검사하는 방법입니다.
1 2 3 4 |
bcrypt.비교 동기화("잘못된 비밀번호", 해시); bcrypt.비교 동기화("내 비밀번호", 해시); |
위의 두 줄은 문서에서 거의 그대로 가져온 것입니다. 첫 번째 줄에서는 비교가 실패하고 사용자에게 거짓을 반환합니다. 이 경우 해시된 비밀번호가 실제로 무엇인지도 모른 채 값이 잘못되었다는 것을 알 수 있습니다. 두 번째 줄의 경우, 비밀번호가 일치하면 진정한 응답을 받게 됩니다.
작업 예제
위에서 배운 내용을 바탕으로 작동하는 예제를 만들어 보겠습니다. 어딘가에 새 디렉터리를 만들고 그 안에 새 package.json 파일에 다음 JSON을 추가합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "name": "비밀번호 해싱 예제", "버전": "1.0.0", "설명": "카우치베이스 및 Bcrypt용 Node.js SDK를 사용하여 비밀번호를 해싱하는 예제", "author": "Couchbase, Inc.", "라이선스": "MIT", "종속성": { "bcryptjs": "^2.3.0", "couchbase": "^2.0.8", "uuid": "^2.0.1" } } |
중요한 부분은 종속성입니다. 여기에는 다음이 포함됩니다. bcryptjs 해싱을 위해, 카우치베이스 애플리케이션을 통해 카우치베이스와 통신할 수 있습니다. uuid 를 사용하여 고유한 문서 키를 생성할 수 있습니다.
이제 다음과 같은 새 파일을 만들어야 합니다. config.json 프로젝트 디렉토리에 다음 JSON을 포함합니다:
1 2 3 4 5 6 7 8 |
{ "couchbase": { "서버": "127.0.0.1:8091", "bucket": "restful-sample" } } |
서버와 버킷을 사용하려는 서버와 버킷으로 교체해야 합니다.
이제 재미있는 부분입니다! 라는 파일을 만듭니다. app.js 에 모든 코드가 저장됩니다. 이 예제는 예시이므로 기능이 제한된다는 점에 유의하세요. 다음 자바스크립트 코드를 app.js file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var 카우치베이스 = require("couchbase"); var bcrypt = require("bcryptjs"); var uuid = require("uuid"); var 구성 = require("./config"); var 버킷 = (new 카우치베이스.클러스터(구성.카우치베이스.서버)).오픈버킷(구성.카우치베이스.버킷); var jsonData = { id: uuid.v4(), 사용자 이름: "nraboy", 비밀번호: bcrypt.해시싱크("내 비밀번호", 10) } 버킷.삽입("user::" + jsonData.id, jsonData, 함수(오류, 결과) { 버킷.get("user::" + jsonData.id, 함수(오류, 결과) { 콘솔.로그("비밀번호 일치 -> " + bcrypt.비교 동기화("잘못된 비밀번호", 결과.값.비밀번호)); 콘솔.로그("비밀번호 일치 -> " + bcrypt.비교 동기화("내 비밀번호", 결과.값.비밀번호)); }); }); |
기본적으로 해시된 비밀번호가 포함된 JSON 문서를 만들어 Couchbase Server에 삽입하기만 하면 됩니다. 삽입이 완료되면 문서를 가져와서 비밀번호를 비교합니다.
결론
데이터베이스에 일반 텍스트 비밀번호를 저장해서는 안 됩니다. 데이터베이스의 보안 수준이나 사용 중인 데이터베이스 유형은 중요하지 않습니다. 비밀번호에 Bcrypt 해싱 알고리즘을 사용하면 사용자를 위한 보안을 대폭 강화할 수 있습니다.
그리고 bcryptjs 라이브러리는 이 작업을 수행할 수 있는 많은 적합한 라이브러리 중 하나에 불과합니다.