programing

Firebase와 함께 NodeJs 사용 - 보안

starjava 2023. 6. 16. 21:17
반응형

Firebase와 함께 NodeJs 사용 - 보안

주로 이메일을 보내는 서버 사이드 코드를 수행해야 하기 때문에 부분적으로 학습 경험에서 데이터를 보관하기 위해 Firebase와 함께 서버 사이드 요소에 Nodejs & Express를 사용하기로 결정했습니다.

Simple Email & Password API를 사용하여 인증을 할 때 클라이언트 측 Firebase 라이브러리와 Nodejs 라이브러리를 사용하는 것과 관련하여 가장 좋은 방법이 무엇인지 질문합니다.인증 클라이언트 측을 수행한 후 노드에서 다른 경로를 호출하는 경우JS 측에서는 해당 사용자에 대한 인증이 요청에서 전달됩니다.사용자가 노드 내에서 인증되었는지 테스트하는 방법은 무엇입니까?

제가 생각하는 한 가지 접근 방식은 Firebase에서 현재 사용자의 사용자 이름과 암호를 가져온 다음 NodeJS에 게시하고 서버의 Firebase 보안 API를 사용하여 테스트하는 것입니다.

근본적으로 문제는 노드에 안전하게 전달해야 한다는 것입니다.클라이언트가 Firebase에 대해 인증된 JS 서버입니다.이 문제를 해결하는 방법은 여러 가지가 있지만 가장 쉬운 방법은 모든 클라이언트를 사용하는 것입니다. <->노드JS 통신은 Firebase 자체를 통해 이루어집니다.

따라서 클라이언트가 노드에서 제공하는 REST 끝점에 도달하는 대신JS 서버, 클라이언트가 노드가 있는 Firebase 위치에 쓰도록 합니다.JS 서버가 모니터링 중입니다.그런 다음 Firebase 보안 규칙을 사용하여 클라이언트가 작성한 데이터의 유효성을 검사하고 서버가 신뢰할 수 있습니다.

예를 들어 사용자가 앱을 통해 임의 전자 메일을 보낼 수 있도록 하려면 노드를 사용합니다.실제로 전자 메일을 보내는 것을 처리하는 JS 서버)에는 다음과 같은 규칙이 있는 /emails_to_send 위치가 있을 수 있습니다.

{
  "rules": {
    "emails_to_send": {
      "$id": {
        ".write": "!data.exists() && newData.child('from').val() == auth.email",
        ".validate": "newData.hasChildren(['from', 'to', 'subject', 'body'])"
      }
    }
  }
}

그러면 클라이언트에서 다음 작업을 수행할 수 있습니다.

ref.child('emails_to_send').push({
  from: 'my_email@foo.com', 
  to: 'joe@example.com', 
  subject: 'hi', 
  body: 'Hey, how\'s it going?'
});

그리고 당신의 노드에서모든 것을 읽고 쓸 수 있도록 Firebase Secret로 .auth()를 호출한 다음 다음 작업을 수행할 수 있습니다.

ref.child('emails_to_send').on('child_added', function(emailSnap) {
  var email = emailSnap.val();
  sendEmailHelper(email.from, email.to, email.subject, email.body);

  // Remove it now that we've processed it.
  emailSnap.ref().remove();
});

이것은 가장 쉽고 가장 정확한 해결책이 될 것입니다.예를 들어 사용자가 Firebase를 통해 로그아웃하면 더 이상 Firebase에 쓸 수 없으므로 노드를 더 이상 만들 수 없습니다.JS 서버가 전자 메일을 보내며, 이는 사용자가 원하는 동작일 가능성이 높습니다.또한 서버가 일시적으로 다운된 경우 백업을 시작할 때 서버가 전자 메일을 보내는 것을 "따라잡을" 것이고 모든 것이 계속 작동한다는 것을 의미합니다.

위의 내용은 우회적인 방법인 것 같습니다. 저는 https://www.npmjs.com/package/connect-session-firebase 과 같은 것을 사용하고 고속을 통해 모든 경로를 처리하는 모델로 파이어베이스를 유지할 것입니다.익스프레스 서버가 JSON API로만 작동하지 않고 템플릿을 렌더링하는 경우 더 쉽습니다.

Firebase 인증을 사용하는 경우 클라이언트 측에서 Firebase 라이브러리(: Javascript용)를 가져오고 라이브러리 자체로 직접 인증할 수 있습니다.

import firebase from 'firebase/app';

const result = await firebase.auth().signInWithEmailAndPassword(_email, _password);

그런 다음 클라이언트는 ID 토큰을 얻을 수 있으며, 이 토큰은 서버에 대한 각 요청(예: 헤더)대해 알려집니다.

const sendingIdToken = await firebase.auth().currentUser.getIdToken();

Node.js 서버 측에서 Firebase Admin SDK를 설치하여 다음과 같이 Node.js 서버에서 사용자가 인증되었는지 확인할 수 있습니다.

// Let's suppose the client informed the token as header
const receivingIdToken = req.headers['auth-token']; 

admin.auth().verifyIdToken(receivingIdToken, true)
  .then((decodedIdToken) => { /* proceed to send emails, etc */}, (error) => {...});

Firebase Admin SDK는 데이터베이스에 대한 전체 권한을 부여하므로 자격 증명을 안전하게 유지합니다.

또한 Firestore(또는 Firebase Realtime)에 보안 규칙을 구성하여 클라이언트 측에서 데이터베이스에 대한 특정 작업(예: 컬렉션의 실시간 변경 내용 수신)을 직접 수행할 수 있지만 클라이언트가 node.js 서버와만 상호 작용하도록 하려면 모든 액세스를 제한할 도 있습니다.

자세한 내용은 Firestore 데이터베이스를 사용하고 보안 등을 처리하는 node.js 서버의 예제를 개발했습니다.

언급URL : https://stackoverflow.com/questions/14673929/using-nodejs-with-firebase-security

반응형