웹 대화 보안 사용

웹 대화 보안을 사용하려면 웹 애플리케이션 서버 코드 및 웹 대화 임베드 스크립트와 웹 대화 통합 설정을 변경해야 합니다.

보안을 사용하는 전체 NodeJS 참조 구현은 watsonx Assistant 웹 대화에 대한 보안 사용을 참조하십시오.

시작하기 전에

보안을 사용하기 전에 RS256 공개/개인 키 쌍을 작성해야 합니다. OpenSSL 또는 PuTTYgen과 같은 도구를 사용할 수 있습니다.

예를 들어, OpenSSL을 사용하여 명령 프롬프트에서 키 쌍을 작성하려면 openssl genrsa -out key.pem 2048 명령을 사용합니다.

생성된 키 쌍을 안전한 위치에 저장하십시오.

서버 코드로만 이 키에 액세스할 수 있는지 확인하십시오. 웹 사이트를 통해 클라이언트 브라우저에 전달하지 마십시오.

JWT 생성

웹 대화 보안을 사용하려면 어시스턴트에 각 메시지와 함께 JWT (JSON Web Token) 를 전송하도록 웹 사이트에서 웹 대화를 구성해야 합니다. JWT는 웹 사이트에서 전송된 메시지의 원본을 확인하고 선택적으로 암호화된 추가 데이터를 전달하는 데 사용됩니다. 웹 사이트는 각 세션 시작 시 및 기존 JWT가 만료될 때마다 새 JWT를 생성할 수 있어야 합니다.

웹 사이트 코드에서 JWT를 하드코딩하거나 사용자 간에 JWT를 공유하지 마십시오.

서버에서 개인 키로 서명된 JWT (JSON Web Token) 를 생성하고 리턴하는 함수를 구현하십시오. 이 토큰을 사용하여 웹 사이트에서 전송된 메시지의 원본을 확인하고 선택적으로 암호화된 추가 데이터를 전달합니다.

대부분의 프로그래밍 언어는 토큰을 생성하는 데 사용할 수 있는 JWT 라이브러리를 제공합니다. 서명된 JWT의 유효성을 검증하기 위해 웹 대화 통합은 RS256 알고리즘과 함께 jsonwebtoken 라이브러리를 사용합니다.

JWT 페이로드는 다음 청구를 지정해야 합니다.

  • sub: 웹 대화와 상호작용하는 고객을 식별하는 고유 사용자 ID입니다. 이는 생성된 고유 ID (익명 사용자의 경우) 또는 인증된 사용자 ID일 수 있습니다. sub 값이 사용되는 방법에 대한 자세한 정보는 웹 대화에서 사용자 인증 을 참조하십시오.

    보안을 보장하기 위해 JWT는 각 사용자에게 고유해야 합니다. 사용자의 인증된 로그인 정보 또는 고유하게 생성된 ID를 사용하십시오. 둘 이상의 사용자에 대해 동일한 JWT 또는 동일한 sub 값을 재사용하지 마십시오.

  • exp: JWT가 더 이상 유효하지 않게 되는 만기 시간입니다. 많은 JWT 라이브러리가 이 값을 자동으로 설정합니다. 수명이 짧은 exp 청구를 설정하십시오 (예: 1h).

    exp 청구 없이 JWT를 작성하지 마십시오. 이 청구가 공식적으로 필요하지는 않지만 JWT에 대한 액세스 권한이 있는 모든 사용자가 이를 복사하고 나중에 이를 사용하여 어시스턴트에 액세스할 수 있으므로 이를 생략하는 것은 보안 노출을 의미합니다. 만기 시간을 설정하면 이 노출이 제한됩니다.

다음 JavaScript 예제는 jsonwebtoken 라이브러리를 사용하여 JWT를 생성하는 방법을 보여줍니다.

// Sample NodeJS code on your server.
const jwt = require('jsonwebtoken');

// Returns a signed JWT signed with the RS256 algorithm.
function createJWT() {
  const payload = {
    sub: 'some-user-id', // Identifies user for billing purposes
  };
  // The "expiresIn" option adds an "exp" claim to the payload.
  return jwt.sign(payload,
    process.env.YOUR_PRIVATE_RSA_KEY,
    { algorithm: 'RS256', expiresIn: '1h' });
}

JWT를 포함하도록 웹 대화 구성

이제 서명된 JWT를 생성하는 기능을 구현했으므로 전송하는 각 메시지와 함께 서명된 JWT를 포함하도록 웹 대화 인스턴스를 업데이트해야 합니다. 웹 대화 보안을 사용으로 설정하면 적절한 개인 키로 서명되지 않은 모든 메시지가 거부됩니다.

웹 사이트 HTML에서 웹 대화 임베드 스크립트를 업데이트하여 각 세션 시작 시 및 기존 JWT가 만료될 때마다 새 JWT를 지정하십시오. 이를 수행하는 가장 간단한 방법은 identityTokenExpired 이벤트에 등록하고 해당 이벤트가 수신될 때 새 JWT를 생성하는 것입니다. identityTokenExpired 이벤트는 다음 두 상황 모두에서 실행됩니다.

  • 새 세션 시작 시 identityToken 구성 옵션을 사용하여 JWT가 제공되지 않은 경우.

  • 이전에 지정된 JWT가 만료되는 경우입니다.

onLoad 이벤트 핸들러에서 on() 인스턴스 메소드를 사용하여 identityTokenExpired 이벤트에 등록하십시오.

콜백에서 새 JWT를 생성하기 위해 구현한 서버의 함수를 호출하십시오. 그런 다음 이벤트의 identityToken 매개변수를 사용하여 다음 예제와 같이 새 JWT를 지정하십시오.

instance.on({ type: 'identityTokenExpired',
              handler: async function(event) {
                const jwtFromServer = await fetch('http://example.com:3001/createJWT');
                event.identityToken = jwtFromServer;
}});

사용자가 지정하는 새 JWT가 웹 사이트의 웹 대화 인스턴스에서 각 후속 메시지와 함께 자동으로 전송됩니다 (토큰이 만료될 때까지).

웹 대화 구성 오브젝트에서 identityToken 특성을 사용하여 세션 시작 시 JWT를 지정할 수도 있습니다. 그러나 세션 중에 JWT가 만료되지 않는다고 확신하는 경우가 아니면 identityTokenExpired 에 대한 이벤트 핸들러를 작성해야 합니다.

웹 대화 설정 업데이트

서명된 JWT를 전송하도록 웹 대화를 구성했으므로 웹 대화 통합 설정에서 웹 대화 보안을 사용으로 설정할 수 있습니다.

웹 대화 보안을 사용으로 설정하면 웹 대화 인스턴스 (서명된 JWT를 전송하도록 구성한) 이외의 원본 메시지가 거부됩니다. 이는 웹 대화 보안을 사용으로 설정하면 공유 가능한 미리보기 링크가 사용 안함으로 설정되어 메시지와 함께 JWT를 전송하지 않음을 의미합니다. 미리보기 링크에 대한 자세한 정보는 공유할 링크 복사 를 참조하십시오.

보안을 사용으로 설정하려면 다음 단계를 완료하십시오.

  1. 웹 대화 통합 설정의 보안 탭에서 웹 대화 보안 스위치를 켜기로 설정하십시오.

  2. 공개 키 필드에 공개 키 를 붙여넣으십시오.

    watsonx Assistant 는 공개 키를 사용하여 수신 메시지가 웹 사이트에서 생성되는지 확인합니다.

다음 다이어그램은 웹 대화 보안이 사용되는 경우 웹 대화와 어시스턴트 간의 메시지 플로우를 보여줍니다.

웹 대화 보안 메시지 플로우