새로운 검증 시스템 설명
버전 24.0.0에서 당사는 기존 등록 시스템을 개선하기 위해 등록 검증 시스템을 도입했습니다. 이 검증 시스템은 고객이 EmEditor를 등록한 장치 수를 추적할 수 있습니다.
이 페이지는 당사의 동기와 검증 시스템의 작동 방식을 투명하게 공개하고 문서화하는 것을 목적으로 합니다. 향후 검증 시스템을 업데이트하면 이 페이지도 업데이트하겠습니다.
동기
과거에는 여러 사람과 라이선스를 공유하거나 EULA(최종 사용자 라이선스 계약)에서 허용된 것보다 많은 장치에서 라이선스를 사용하는 사용자를 감지할 방법이 없었습니다. 당사는 고객이 라이선스 조건을 준수할 수 있도록 충분한 라이선스를 구매하기를 바랍니다. 이는 여러 라이선스를 구매한 고객 간의 공정성을 보장하고 당사가 양질의 제품을 계속 제공하는 데 도움이 됩니다.
용어
- 등록: 등록 키 또는 Emurasoft 고객 센터 자격 증명으로 EmEditor Professional을 활성화하는 일회성 프로세스입니다.
- 검증: EmEditor가 시작될 때마다 실행되어 현재 설치가 유효한 라이선스와 연결되어 있는지 확인하는 정기 검사입니다.
- 등록 키: EmEditor를 등록하는 데 사용되는 문자열입니다.
- 오프라인 등록: EmEditor 서버에 연결하지 않고 EmEditor를 등록하고 검증할 수 있는 등록 유형입니다.
- 장치: 라이선스에 따라 계산되는 단일 단위로, 하나의 EmEditor 설치를 나타냅니다. 동일한 머신에 있는 여러 사용자별 EmEditor 설치는 하나의 장치로 간주됩니다.
- 장치 제한: EULA에 정의된 대로 사용자가 소유한 라이선스 수에 따라 사용자에게 등록될 수 있는 최대 장치 수입니다.
- 머신: EmEditor가 설치되어 실행될 수 있는 Windows 환경입니다. 머신은 머신 ID로 고유하게 식별됩니다. 하나의 컴퓨터에 여러 가상 머신을 설치할 수 있으므로 머신이 반드시 실제 컴퓨터와 동일한 것은 아닙니다.
- 머신 ID: 머신을 다른 머신과 구별하는 데 사용되는 여러 Windows 특성(MachineGuid, OS 설치 날짜, 볼륨 일련 번호, 프로세서 이름 및 마더보드 이름)의 조합입니다.
- MachineGuid: Windows 설치의 식별자로, 머신 ID의 입력 중 하나로 사용됩니다.
- 가상 머신(VM): 가상화 환경에서 실행되는 Windows 머신입니다.
- 로컬 장치 토큰: 장치가 등록되었음을 확인하기 위해 사용자의 머신에 저장되는 서명된 토큰입니다.
- 기록 레코드: 2Checkout 또는 리셀러 구매와 연결된 데이터베이스 레코드입니다.
- Stripe 구독 ID: 등록된 장치를 Stripe 구독과 연결하는 데 사용되는 사용자의 Stripe 구독 식별자입니다.
- 리셀러: EmEditor 라이선스를 판매하는 타사 공급업체(2Checkout 또는 Stripe 제외)입니다. 리셀러를 통해 구매한 고객은 제품을 등록하고 고객 센터 계정을 만들어 온라인에서 장치를 보고 관리해야 합니다.
- 등록된 장치 페이지: 고객의 라이선스 및 구독에 대해 현재 등록된 모든 장치를 나열하는 Emurasoft 고객 센터의 페이지입니다.
- Go: 서버 측 로직에 사용되는 프로그래밍 언어입니다.
요구 사항
이 섹션에서는 검증 시스템의 요구 사항을 설명합니다.
기능
- 검증 시스템은 라이선스의 장치 제한 조항을 느슨하게 적용해야 합니다. 고객 만족도를 희생해서는 안 되며, 제한이 사용자에게 뜻밖의 일이 되어서는 안 됩니다.
- 등록은 사용자가 등록 제품 대화 상자를 제출하거나 다른 등록 흐름을 완료할 때 한 번 실행됩니다. 검증은 EmEditor가 열릴 때마다 실행됩니다.
- 등록을 위해서는 EmEditor가 HTTPS를 통해
support.emeditor.com에 연결할 수 있어야 하지만, 검증에는 인터넷 연결이 필요하지 않습니다. - 사용자는 당사 서버에 연결하지 않고 앱을 등록하고 검증할 수 있는 오프라인 라이선스를 사용할 수 있어야 합니다. 일반 등록 중 오류가 발생하면 오프라인 라이선스가 등록할 수 있는 대안을 제공해야 합니다.
- 사용자의 개인정보 보호 권리가 유지되어야 합니다. 개인정보 수집은 옵트인 방식입니다.
- 시스템은 기존 등록 흐름에 맞아야 하며 완전히 새로운 등록 방식을 도입해서는 안 됩니다. 기존 사용자는 새로운 단계를 배우지 않고도 등록할 수 있어야 합니다.
- 등록을 해제하는 네 가지 간편한 방법이 있어야 합니다. 등록 정보 대화 상자의 등록 해제 버튼, 명령줄(/unregister), Emurasoft 고객 센터, 그리고 비활성 상태가 지속되면 자동으로 장치 등록 해제가 이루어집니다.
- 사용자는 Emurasoft 고객 센터에 로그인하여 장치를 확인할 수 있으므로 앱 외부에서 장치를 등록 해제할 수 있습니다.
- 2Checkout 이외의 리셀러에서 구매한 고객은 제품을 등록하고 고객 센터 계정을 만들어야 합니다. 그렇지 않으면 온라인에서 장치를 보고 관리할 방법이 없기 때문입니다.
- 시스템은 버전 23에서 백그라운드로 테스트되어야 하며 버전 24부터 완전히 적용되어야 합니다.
- 당사는 Stripe를 통해 구독 판매를 시작할 예정이므로 시스템은 Stripe와 통합할 수 있어야 합니다.
- 당사는 Stripe 구독에 대한 등록 키를 제공할 예정입니다.
- 사용자는 자주 다시 등록하지 않고 VM 환경에서 EmEditor를 사용할 수 있어야 합니다.
기술
-
시스템은 유지 관리가 쉽도록 단순해야 합니다.
-
머신은 머신 ID로 식별할 수 있습니다.
- 머신 ID는 머신을 식별하는 데 사용되는 여러 Windows 상수의 조합입니다.
- 이러한 값은 머신을 고유하게 식별할 수 있으므로 원시 값을 평문으로 저장하지 않도록 해시해야 합니다.
- EmEditor 휴대용은 USB 드라이브에 설치할 수 있으며 설정이 해당 드라이브에 저장됩니다. USB 드라이브는 여러 머신에서 사용할 수 있으며 검증 시스템은 서로 다른 머신 ID를 감지합니다. 따라서 앱이 USB 드라이브에서 실행되는 휴대용 버전임을 감지하면 등록이 수행되지 않습니다.
-
EmEditor는 다중 사용자 머신에 사용자별로 설치할 수 있습니다. 동일한 머신에 있는 모든 사용자별 EmEditor 설치는 하나의 장치로 계산되어야 합니다.
-
필요한 경우 특정 등록 키에 대한 장치 제한을 재정의할 수 있는 방법이 있어야 합니다.
-
장치 정보가 포함된 서명된 토큰이 사용자의 장치에 저장되어야 합니다. 이렇게 하면 현재 장치가 데이터베이스에 저장된 장치 레코드와 연결됩니다.
-
시스템은 필요한 경우 향후 플로팅 라이선스 메커니즘을 통합할 수 있도록 설계되어야 합니다.
출력
- 고객 센터의 등록된 장치 페이지에서 모든 장치 목록을 볼 수 있습니다.
- 장치 제한에 도달하면 알림이 표시됩니다. 앱은 장치 제한을 초과해도 사용을 막지 않습니다.

- 사용자가 리셀러(2Checkout 또는 Stripe 제외)에서 앱을 구매하고 제품을 등록하지 않은 경우, 알림에서 제품 등록을 요청합니다.
장치 테이블
장치 테이블은 데이터베이스에 저장되며 등록된 모든 장치를 기록합니다. History 레코드는 구매와 연결되며 기존 등록 키가 저장되는 곳입니다. Device 레코드는 Go로 다음과 같이 정의됩니다.
type Device struct {
DeviceID string
UserID int
HistoryID sql.NullInt64
StripeSubscriptionID sql.NullString
MachineID MachineID
RegistrationDate time.Time
ValidationDate time.Time
InstallationType InstallationType
Label string
Unregistered bool
}
필드는 등록된 장치 문서에 설명되어 있습니다. MachineID 필드는 아래에 설명되어 있습니다.
레이블 개인정보 보호 조치
Label 필드에는 개인정보가 포함될 수 있습니다. 등록 제품 대화 상자의 장치 레이블 필드 기본값은 {computer name} {user name}입니다. 레이블 필드의 개인정보는 앱의 기본 기능에 필요하지 않습니다. 따라서 당사는 기본적으로 개인정보를 보호한다는 정책을 유지하기 위해 레이블 필드를 옵트인 방식으로 만들었습니다.
머신 ID
머신 ID는 머신을 식별하는 데 사용되며 다음 구조에 저장됩니다.
type MachineID struct {
// Identifies a Windows installation
// HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid
MachineGuid string
// Time of Windows installation
// SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallTime
OSInstallDate string
// Filesystem identifier created when a storage drive is formatted
// Volume serial number from GetVolumeInformationW()
VolumeSerialNumber string
// Name of processor
// HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString
ProcessorName string
// Name of motherboard
// HARDWARE\DESCRIPTION\System\BIOS\BaseBoardManufacturer and HARDWARE\DESCRIPTION\System\BIOS\BaseBoardProduct
MotherboardName string
}
각 필드는 등록 요청이 전송되기 전에 클라이언트 머신에서 안전하게 해시됩니다. 해시된 머신 ID는 종단 간 암호화를 통해 데이터베이스에 안전하게 저장됩니다. 평문 식별자 값은 전송되지 않으며 당사 서버에 저장되지 않습니다.
머신 ID 비교
당사는 두 머신이 동일한지 확인하기 위해 여러 Windows 상수를 사용합니다. 이전에는 MachineGuid가 특정 머신에 대해 일정하게 유지된다고 가정했지만, 이는 사실이 아닌 것으로 밝혀졌습니다. 단일 EmEditor 설치에 대해 MachineGuid가 변경되는 일반적인 경우는 고객이 앱을 VM 드라이브에 설치한 후 해당 드라이브를 다른 Windows 설치로 부팅할 때입니다.
견고성을 개선하기 위해 당사는 대부분 일정하며 함께 머신을 식별하는 데 도움이 되는 OS의 여러 값을 사용합니다. 다음 알고리즘을 사용하여 두 머신이 동일한 것으로 간주되는지 결정합니다.
// Returns true if machine a and b are considered to be equal.
// Machines are considered equal if it scores at least 3 points from the following points.
// 3 points: MachineGuid matches
// 2 points: OS install date matches
// 2 points: Volume serial number matches
// 1 point: Processor name matches
// 1 point: Motherboard name matches
func IsMachineIDSame(a, b MachineID) bool {
// Quick check: MachineGuid matches (3 points)
if a.MachineGuid == b.MachineGuid {
return true
}
score := 0
// 2 points: OS install date matches
if a.OSInstallDate == b.OSInstallDate {
score += 2
}
// 2 points: Volume serial number matches
if a.VolumeSerialNumber == b.VolumeSerialNumber {
score += 2
}
// 1 point: Processor name matches
if a.ProcessorName == b.ProcessorName {
score += 1
}
// 1 point: Motherboard name matches
if a.MotherboardName == b.MotherboardName {
score += 1
}
return score >= 3
}
MachineGuid가 동일하면 두 머신을 즉시 동일한 것으로 간주합니다. 그렇지 않으면 최소 두 개의 다른 일치 값에 해당하는 총 3점 이상을 찾습니다. 아래에 설명된 장치 수는 이 로직을 사용하여 고유한 머신 수를 결정합니다.
버전 24.5 이전에는 머신이 동일한지 확인할 때 MachineGuid만 고려했습니다. VM을 사용하는 일부 고객은 자주 등록하지 않았다고 생각했음에도 불구하고 장치 제한에 빠르게 도달하여 부정적인 경험을 했습니다. MachineGuid 외에 다른 상수도 고려함으로써 당사는 예기치 않게 장치 제한에 도달하지 않고 VM 환경에서 EmEditor를 사용할 수 있도록 보장하는 데 도움을 줍니다.
장치 수
이 섹션에서는 등록할 수 있는 장치 수를 결정하는 방법을 설명합니다.
먼저 지정된 등록 키 또는 Stripe 구독 ID와 연결된 모든 장치를 조회하고 현재 등록된 장치로 필터링합니다.
다음으로 위에서 설명한 로직을 사용하여 고유한 머신 수를 계산합니다. IsMachineIDSame에 따라 두 장치의 머신 ID가 같으면 장치 수는 1입니다. 두 장치의 머신 ID가 다르면 장치 수는 2입니다. 동일한 머신에 있는 것으로 간주되는 여러 장치가 있는 경우, 이는 동일한 머신 또는 VM에 있는 사용자별 설치를 나타낼 수 있습니다.
EULA에 따라 라이선스 사용자는 라이선스당 최대 두 개의 장치에 EmEditor를 설치할 수 있습니다. EmEditor를 개인 용도로 사용하고 회사 컴퓨터에 설치하지 않는 경우, 라이선스 사용자는 라이선스당 최대 다섯 개의 장치에 EmEditor를 설치할 수 있습니다.
사용자의 최대 장치 제한을 구하는 알고리즘은 공개적으로 문서화되지 않습니다.
로컬 장치 토큰
LocalDevice 토큰은 JWT(JSON 웹 토큰) 형태로 사용자의 장치에 로컬로 저장됩니다. 이 토큰은 현재 장치를 데이터베이스 Device 레코드와 연결합니다. 또한 오프라인 상태에서도 EmEditor가 일부 검증을 수행할 수 있게 합니다. 토큰 페이로드는 다음과 같이 정의됩니다.
type LocalDevice struct {
DeviceID string
MachineID MachineID
// StripeSubscriptionID is empty if this device is not associated with a subscription.
StripeSubscriptionID string
}
사용자별 설치의 경우 토큰은 레지스트리의 Computer\HKEY_CURRENT_USER\Software\EmSoft\EmEditor v3\Common에 LocalDeviceToken으로 저장됩니다.
오프라인 등록
오프라인 라이선스를 사용하면 인터넷 연결 없이 등록할 수 있습니다. 등록에는 라이선스 파일만 필요합니다.
고객은 오프라인 라이선스 파일을 요청할 수 있습니다. 고객은 요청에 기존 등록 키 또는 Stripe 주문 ID를 포함해야 합니다. 당사는 영업일 기준 며칠 이내에 라이선스 파일과 함께 고객의 이메일 주소로 회신합니다. 라이선스 파일은 다음 페이로드를 가진 JWT 토큰이 포함된 텍스트 파일입니다.
type LicenseFile struct {
LicenseID string
UserID int
FullName string
Email string
// Is nil if not a Stripe subscription
StripeSubscriptionID *string
// Is nil if not a registration key
HistoryID *int
}
오프라인 라이선스 토큰은 레지스트리 항목 OfflineLicense에 저장됩니다.
장치 제한이 적용되고 라이선스 파일의 불법 공유가 방지되는 세 가지 방법이 있습니다. 1) EmEditor가 인터넷에 접속할 수 있으면 검증이 수행됩니다. 2) 당사는 웹사이트에서 다운로드하는 대신 이메일로만 라이선스 파일을 보냅니다. 3) 등록 정보 대화 상자에 라이선스 소유자의 전체 이름과 이메일이 표시됩니다.
OfflineLicense 테이블
오프라인 라이선스의 사용은 OfflineLicense 테이블을 사용하여 추적됩니다. 이 테이블에는 라이선스를 사용한 머신 수를 추적하기 위한 머신 ID와 라이선스를 취소할 수 있도록 하는 Revoked 플래그가 포함됩니다.
type OfflineLicense struct {
LicenseID string
UserID int
MachineID MachineID
StripeSubscriptionID sql.NullString
HistoryID sql.NullInt64
// Revoked indicates that this license cannot be used
Revoked bool
}
등록 정보 대화 상자
등록 정보에는 사용자의 등록에 대한 정보가 표시됩니다. 이는 등록 상태를 확인하고 검증 관련 문제를 진단하는 데 유용합니다. 또한 사용자가 장치 정보를 편집하고 등록을 해제할 수 있습니다.
대화 상자는 검증을 실행하고 성공 여부를 표시합니다.
Stripe 등록 키
당사는 Stripe 구독 전용의 새로운 등록 키 형식을 도입했으며, 이 문서에서는 이를 “Stripe 등록 키”라고 합니다. 이전 형식은 “기존 등록 키”라고 하며, “등록 키”라는 용어는 두 형식을 모두 아우르는 데 사용됩니다.
Stripe 등록 키 형식은 다음과 같습니다.
r-xxxx-xxxx-xxxx-xxxx-xxxx
여기서 x는 base58 문자입니다. 각 문자는 무작위로 생성되므로 Stripe 등록 키 하나는 117비트의 엔트로피를 가집니다.
등록 프로세스
등록 프로세스가 발생할 수 있는 네 가지 시나리오가 있습니다.
- 대부분의 사용자는 등록 제품 대화 상자를 통해 등록합니다.
- 머신별 등록은
/register명령으로 수행할 수 있습니다. - 오프라인 등록은
/ol명령으로 수행할 수 있습니다. - 장치를 등록 해제한 후 해당 장치에서 EmEditor를 열면 장치가 자동으로 등록됩니다.
기존 등록 키를 사용하는지(RegisterDeviceLegacyRegkey()), Stripe 등록 키를 사용하는지(RegisterDeviceStripeRegkey), 또는 Stripe 구독을 사용하는지(RegisterDeviceSubscription())에 따라 세 가지 온라인 등록 흐름이 있습니다. 오프라인 등록을 위한 추가 등록 흐름(StoreOfflineLicenseAndValidate())이 있습니다.
이 섹션에서 “클라이언트”는 사용자 머신의 로컬 EmEditor 앱을 의미합니다. “서버”는 당사의 백엔드 서버 및 데이터베이스입니다.
사용할 구독 찾기
-
사용자가 로그인하면 서버는 연결된 장치가 0개인 유효한 Stripe 구독을 찾으려고 시도합니다.
-
연결된 장치가 0개인 구독이 없으면 장치 제한을 초과하지 않은 구독을 찾으려고 시도합니다.
- 사용 가능한 Stripe 구독이 있으면
RegisterDeviceSubscription()이 호출됩니다. - 그러한 Stripe 구독이 없으면 장치 제한을 초과하지 않은 유효한 기존 등록 키를 찾습니다. 기존 등록 키에는
RegisterDeviceLegacyRegkey()가 사용됩니다.
- 사용 가능한 Stripe 구독이 있으면
기존 등록 키를 사용한 등록(RegisterDeviceLegacyRegkey())
-
장치 토큰이 이미 있으면 클라이언트는 서버에 등록 해제 요청을 보냅니다. 토큰과 등록 키는 레지스트리에서 삭제됩니다.
-
클라이언트는 기존 등록 키, 이메일, 머신 ID, 레이블 및 설치 유형을 포함한 등록 요청을 서버에 보냅니다.
-
서버는 입력한 이메일을 사용자의 실제 이메일과 비교하여 유사한지 확인합니다.
-
서버는 머신 ID와 연결된 장치 수(이전 섹션에서 정의됨)를 가져와 기존 등록 키를 사용하여 장치를 등록할 수 있는지 확인합니다.
- 장치 제한을 초과하면 현재로부터 60일 이전의
ValidationDate를 가진 장치를 등록 해제합니다. 장치 수를 다시 가져옵니다.
- 장치 제한을 초과하면 현재로부터 60일 이전의
-
Device레코드가 생성됩니다. -
클라이언트는 장치 ID를 받습니다. 장치 ID를 사용하여 클라이언트는 로컬 장치 토큰을 요청합니다.
-
서버는 로컬 장치 토큰을 생성하여 응답합니다. 토큰의 만료 날짜는 기존 등록 키 만료 날짜로 설정됩니다. 클라이언트는 토큰을 로컬 저장소에 기록합니다.
Stripe 등록 키를 사용한 등록(RegisterDeviceStripeRegkey())
-
장치 토큰이 이미 있으면 클라이언트는 서버에 등록 해제 요청을 보냅니다. 토큰과 등록 키는 레지스트리에서 삭제됩니다.
-
클라이언트는 Stripe 등록 키, 이메일, 머신 ID, 레이블 및 설치 유형을 포함한 등록 요청을 서버에 보냅니다.
-
서버는 입력한 이메일을 사용자의 실제 이메일과 비교하여 유사한지 확인합니다.
-
서버는 Stripe 구독이 유효한지 확인합니다.
-
서버는 머신 ID와 연결된 장치 수(이전 섹션에서 정의됨)를 가져와 Stripe 등록 키를 사용하여 장치를 등록할 수 있는지 확인합니다.
- 장치 제한을 초과하면 현재로부터 60일 이전의
ValidationDate를 가진 장치를 등록 해제합니다. 장치 수를 다시 가져옵니다.
- 장치 제한을 초과하면 현재로부터 60일 이전의
-
Device레코드가 생성됩니다. -
클라이언트는 장치 ID를 받습니다. 장치 ID를 사용하여 클라이언트는 로컬 장치 토큰을 요청합니다.
-
서버는 로컬 장치 토큰을 생성하여 응답합니다. 구독 상태가 활성이면 토큰의 만료는 한 달 후로 설정됩니다. 구독 상태가 취소됨이면 만료 날짜는 현재 청구 기간의 종료 날짜로 설정됩니다. 클라이언트는 토큰을 로컬 저장소에 기록합니다.
Stripe 구독을 사용한 등록(RegisterDeviceSubscription())
-
장치 토큰이 이미 있으면 클라이언트는 서버에 등록 해제 요청을 보냅니다. 토큰과 등록 키는 레지스트리에서 삭제됩니다.
-
클라이언트는 Stripe 구독, 머신 ID, 레이블 및 설치 유형을 포함한 등록 요청을 서버에 보냅니다.
-
서버는 Stripe 구독이 유효한지 확인합니다.
-
서버는 머신 ID와 연결된
deviceCount(이전 섹션에서 정의됨)를 조회하여 Stripe 구독을 사용하여 장치를 등록할 수 있는지 확인합니다.- 장치 제한을 초과하면 현재로부터 60일 이전의
ValidationDate를 가진 장치를 등록 해제합니다. 장치 수를 다시 가져옵니다.
- 장치 제한을 초과하면 현재로부터 60일 이전의
-
Device레코드가 생성됩니다. -
클라이언트는 장치 ID를 받습니다. 장치 ID를 사용하여 클라이언트는 로컬 장치 토큰을 요청합니다.
-
서버는 로컬 장치 토큰을 생성하여 응답합니다. 구독 상태가 활성이면 만료는 한 달 후로 설정됩니다. 구독 상태가 취소됨이면 만료 날짜는 현재 청구 기간의 종료 날짜로 설정됩니다. 클라이언트는 토큰을 로컬 저장소에 기록합니다.
명령줄에서 등록(/register)
/register 명령은 머신별 등록을 수행합니다. 즉, 머신의 모든 Windows 사용자에 대해 EmEditor를 등록하는 반면, 등록 제품 대화 상자는 현재 사용자에 대해서만 EmEditor를 등록합니다. 이 명령은 Windows 시스템에서 여러 사용자를 위해 EmEditor를 설정하는 IT 관리자를 위한 것입니다. 명령은 결과를 표준 오류 스트림에 기록합니다.
emeditor.exe /register /regname "Name or organization name" /regkey "Registration Key" /regemail "user@example.com" /reglabel "Label for PC"
매개 변수는 등록 제품 대화 상자의 등록 필드와 동일합니다. 라이선스 사용자 이름(/regname), 등록 키(/regkey) 및 이메일 주소(/regemail)는 필수이며 장치 레이블(/reglabel)은 선택 사항입니다. 이름은 등록 서버로 전송되지 않으며 레이블은 생략할 수 있습니다.
명령이 실행되면 다음과 같은 작업을 수행합니다.
- 컴퓨터에 기존 등록이 있으면 등록을 해제합니다.
- 등록 서버에 연결하여 머신을 하나의 장치로 등록합니다. 이 단계에는 인터넷 연결이 필요합니다.
HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common에 새 레지스트리 항목을 쓸 수 있도록 허용하는 UAC(사용자 계정 컨트롤) 프롬프트를 표시합니다.
EmEditor는 1년 동안 HKLM 항목을 수정할 필요가 없습니다. 1년 후 구독이 갱신되면 emeditor /registrerrenew를 실행하여 레지스트리 항목을 업데이트하고 EmEditor가 등록되도록 하십시오.
명령줄에서 머신별 등록 갱신(/registerrenew)
/register로 등록된 장치는 HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common\LocalDeviceToken에 장치 토큰을 유지합니다. 이 항목은 수정하려면 관리자 권한이 필요하므로 수동으로 갱신해야 합니다.
emeditor.exe /registerrenew
명령은 매개 변수를 사용하지 않습니다. /register 및 /unregister와 마찬가지로 결과를 표준 오류 스트림에 기록합니다.
다음과 같은 경우 명령이 거부됩니다.
- 다른
EmEditor.exe프로세스가 실행 중인 경우. 명령이 변경하는 등록 상태를 다시 작성할 수 있기 때문입니다. - EmEditor가 휴대용 또는 Microsoft Store 설치인 경우. 둘 다 머신 전체 토큰을 쓸 수 없기 때문입니다.
- 명령줄에
/register또는/unregister도 포함된 경우. - 머신 전체
LocalDeviceToken항목이 존재하지 않는 경우. 사용자별 등록 또는 오프라인 라이선스로만 등록된 머신에는 머신 전체 토큰이 없으므로 이 명령으로 갱신되지 않습니다.
명령이 실행되면 다음과 같은 작업을 수행합니다.
HKEY_LOCAL_MACHINE에서 머신 전체LocalDeviceToken항목을 직접 읽습니다. 사용자별 항목은 존재하더라도 읽지 않습니다.- 서버에 장치를 등록합니다. 이 단계에는 인터넷 연결이 필요합니다.
- 장치를 검증하기 위해 서버에서 장치 레코드를 요청합니다.
- 서버에서 새 머신별 장치 토큰을 요청합니다.
- UAC 프롬프트를 표시하는
eeadmin.exe /writedevice를 통해 새 토큰을HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common\LocalDeviceToken에 기록합니다. - 표준 오류 스트림에 메시지를 출력합니다. 갱신된 등록은 1년 동안 또는 장치가 등록 해제될 때까지 유효합니다.
오프라인 라이선스로 등록(StoreOfflineLicenseAndValidate())
사용자는 라이선스 파일을 파일 시스템에 저장한 다음 명령줄 옵션을 실행하여 오프라인 라이선스를 등록합니다.
/ol "licenseFilePath"
이 목록은 오프라인 등록 프로세스를 간략히 설명합니다.
- 레지스트리에서 등록 키, 로컬 장치 토큰 및 오프라인 라이선스 토큰을 삭제합니다.
- 라이선스 파일을 읽고 레지스트리에 저장합니다.
ValidateDevice()를 실행합니다.
검증 프로세스(ValidateDevice())
검증은 앱이 열릴 때마다 수행됩니다.
-
레지스트리에서 기존 로컬 장치 토큰 항목을 조회합니다. 먼저
HKEY_CURRENT_USER\Software\EmSoft\EmEditor v3\Common\LocalDeviceToken항목을 가져옵니다. 존재하지 않으면HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common\LocalDeviceToken항목을 가져옵니다.- 두 위치에 로컬 장치 토큰이 없으면
ValidateOfflineLicense()를 호출합니다.
- 두 위치에 로컬 장치 토큰이 없으면
-
토큰의 서명이 검증됩니다. 실제 머신 ID를 토큰의 머신 ID와 비교합니다. 앱이 이동식 드라이브에서 실행 중이면 결과는 무시됩니다.
- 머신 ID 불일치와 같은 예상된 이유로 검증에 실패하면 그 이유가 상태 텍스트로 출력됩니다.
- 토큰이 만료되었으면 구독이 유효한지 확인한 다음 새 토큰을 가져오려고 시도합니다.
- 네트워크 오류와 같은 다른 예기치 않은 오류의 경우 검증이 성공합니다.
-
난수 생성기가 여기서 검증을 중단해야 하는지 결정합니다. 이는 서버에 대한 요청 부하를 줄이기 위한 것입니다.
-
검증 함수는 스레드를 일정 시간 동안 대기시킵니다. 이 역시 앱을 빠르게 시작하고 닫는 매크로 및 기타 자동화 사용 사례는 짧은 시간 동안만 실행될 것이라고 가정하므로 요청 부하를 줄이기 위한 것입니다.
-
클라이언트는 저장된 장치 ID에 대한
Device데이터를 요청합니다. -
장치가 Stripe 구독과 연결되어 있으면 서버는 Stripe 구독이 유효한지 확인합니다.
-
device.Unregistered == true이면 클라이언트는 장치 등록을 시도합니다. -
device.ValidationDate가 업데이트됩니다. -
토큰이
current time - 7 days이전에 발급되었고 장치 토큰이HKEY_CURRENT_USER에서 조회된 경우, 이전 토큰을 갱신하기 위해 새 토큰이 생성됩니다. 새 토큰의 만료 날짜는 한 달입니다.
오프라인 라이선스 검증 프로세스(ValidateOfflineLicense())
오프라인 라이선스 검증은 레지스트리에 로컬 장치 토큰이 없는 경우 수행됩니다. 예기치 않은 오류가 발생하면 검증이 성공합니다. 즉, 사용자가 오프라인 상태여도 검증이 성공합니다.
- 오프라인 라이선스 토큰이 없으면 검증이 성공합니다. 이런 경우 중 하나는 이전에 네트워크 오류로 등록에 실패했지만 등록 키는 유효했던 경우입니다. 이렇게 하면 이 경우에도 EmEditor를 사용할 수 있습니다.
- 토큰을 읽고 검증합니다.
- 토큰과 머신 ID로 오프라인 라이선스 검증을 서버에 요청합니다.
- 서버가 토큰을 검증합니다.
- Stripe 구독의 경우 서버는 구독 상태가
active인지 확인합니다. - 라이선스 ID에 대한
OfflineLicense항목이 없으면 토큰 데이터로 생성됩니다. - 항목이 존재하고
license.Revoked == true이면StatusLicenseRevoked를 반환합니다. 그렇지 않으면 검증이 성공합니다.
등록 해제
새 MSIX 설치 프로그램은 제거 시 스크립트 실행을 허용하지 않으므로 사용자가 앱을 제거할 때 장치를 자동으로 등록 해제할 수 없습니다. 휴대용 버전과 Microsoft Store 버전에도 동일한 제한이 적용됩니다. 둘 다 스크립트를 실행할 수 있는 제거 단계가 없기 때문입니다.
당사는 사용자가 새 설치를 위해 라이선스를 쉽게 확보할 수 있기를 바랍니다. 이를 위해 장치를 등록 해제하는 네 가지 편리한 방법이 있습니다.
-
EmEditor에서 등록 정보 대화 상자를 열고 등록 해제를 클릭합니다.
- 이렇게 하면 등록 해제 엔드포인트를 호출하여 서버 측에서 장치를 등록 해제한 다음 사용자별
LocalDeviceToken및EmEditor-14레지스트리 항목을 제거합니다. 이제 장치가 등록 해제되었으며 사용자에게 등록 대화 상자가 표시됩니다.
- 이렇게 하면 등록 해제 엔드포인트를 호출하여 서버 측에서 장치를 등록 해제한 다음 사용자별
-
emeditor /unregister명령을 사용합니다.- 등록 해제 버튼과 마찬가지로 이 명령은 등록 해제 엔드포인트를 호출합니다. 또한
LocalDeviceToken,OfflineLicence및EmEditor-14에 대한 사용자별 및 머신별 레지스트리 항목을 모두 삭제합니다. 이 방법은emeditor /register로 머신별 등록 방법을 사용한 IT 관리자를 위해 설계되었습니다. - 컴퓨터가 오프라인이면 명령은 아무 작업도 수행하지 않고 오류와 함께 종료됩니다.
- 등록 해제 버튼과 마찬가지로 이 명령은 등록 해제 엔드포인트를 호출합니다. 또한
-
Emurasoft 고객 센터의 등록된 장치 페이지를 사용합니다. 장치 항목에서 편집을 클릭한 다음 이 장치를 등록 해제하려면 클릭을 클릭합니다.
- 이 방법은 EmEditor 설치에 대한
LocalDeviceToken레지스트리 항목을 삭제하지 않으므로 장치는 로컬에서 등록된 상태로 유지됩니다. 이후 해당 장치에서 EmEditor를 열면 자동으로 다시 등록되어 라이선스를 다시 사용하게 됩니다. 이 방법은 등록 해제 전에 이미 EmEditor를 제거한 사용자를 위한 것입니다.
- 이 방법은 EmEditor 설치에 대한
-
서버는 사용하지 않는 장치를 자동으로 등록 해제합니다.
- 장치가 등록 엔드포인트를 호출하고 서버 측 검증에서 장치 제한에 도달한 것으로 감지되면 서버는 장치 정리를 실행합니다. 요청된 구독에 등록된 각 장치에 대해
ValidationDate항목이 두 달 이상 지난 경우 해당 장치가 등록 해제됩니다. 이는 제한을 벗어나는 데 필요한 수만이 아니라 그러한 모든 장치에 적용됩니다. 그렇게 오래된ValidationDate는 EmEditor가 오랫동안 검증하지 않았으므로 장치가 더 이상 사용되지 않음을 나타냅니다. 그런 다음 서버는 검증을 다시 시도합니다. 장치 수가 이제 더 낮을 수 있으므로 이번에는 검증이 성공할 수 있습니다. - 이렇게 하면 사용자가 더 이상 사용하지 않는 오래된 장치 때문에 예기치 않은 장치 제한 문제를 겪는 것을 방지할 수 있습니다.
- 장치가 서버에서 등록 해제되었지만 로컬 EmEditor 앱 내에서는 등록 해제되지 않은 경우, 장치 제한에 이미 도달하지 않았다면 사용자는 중단 없이 앱을 계속 사용할 수 있습니다. 다음 장치 검증 시 라이선스 슬롯이 있으면 서버가 자동으로 장치를 다시 등록합니다.
- 장치가 등록 엔드포인트를 호출하고 서버 측 검증에서 장치 제한에 도달한 것으로 감지되면 서버는 장치 정리를 실행합니다. 요청된 구독에 등록된 각 장치에 대해
보안
당사는 개인정보를 보호하고 검증 시스템의 악용을 방지하기 위해 보안 중심 설계 방식을 사용하고 있습니다. 다음은 시스템을 구현할 때 사용한 지침 원칙 중 일부를 나열한 것입니다.
-
종단 간 암호화
- 모든 클라이언트-서버 및 서버-서버 통신은 안전하지 않은 대체 수단 없이 CA가 검증한 TLS 암호화와 함께 HTTPS를 사용합니다.
- 서버 측 데이터베이스 레코드는 Azure 관리형 암호화 및 보안 설정으로 보호됩니다.
-
토큰 보안
- 로컬 장치 토큰과 오프라인 라이선스 토큰은 JWT 표준을 따르며 ECDSA로 서명됩니다. 이렇게 하면 개인 키를 공유하지 않고도 클라이언트 측 인증이 가능합니다.
-
개인 식별 정보(PII) 개인정보
- 등록 중 레이블 옵션은 선택 사항입니다.
- MachineID 필드는 암호화되어 전송되기 전에 클라이언트 측에서 안전하게 해시됩니다. 이러한 필드의 평문 내용은 전송되지 않으며 당사 서버에 저장되지 않습니다.
- 클라이언트 측 로그는 유지되지 않습니다. 서버 측 로그에는 요청에 대한 최소한의 데이터가 포함되며 등록 필드와 같은 요청 본문 내용은 포함되지 않습니다.
지원
검증 시스템에 대해 질문이나 의견이 있으시면 언제든지 메시지를 보내 주십시오.