HMAC 생성 및 검증
const moment = require('moment');
const qs = require('qs');
const crypto = require('crypto');
function HmacUtil () {
this.algorithm = "sha256"
this.secretKey = "test_secret_key"
this.expiresIn = 2 * 60 * 1000 // 2minutes
this.hmacDatetime = function() {
return moment().format("YYYY-MM-DDTHH:mm:ssZ")
}
this.alphabeticalSort = function(a, b) {
return a.localeCompare(b);
}
this.sortedQueryString = function(encodedQueryString) {
let obj = qs.parse(encodedQueryString);
return qs.stringify(obj, { sort: this.alphabeticalSort });
}
this.payloadHash = function(payload) {
return crypto.createHash(this.algorithm).update(payload,'utf8').digest('hex');
}
this.stringToSign = function(method, uri, hmacDatetime, queryString, payload) {
return method + "\n" + uri + "\n" + hmacDatetime + "\n" + this.sortedQueryString(queryString) + "\n" + this.payloadHash(payload)
}
this.sign = function(stringToSign) {
rawHmac = crypto.createHmac(this.algorithm, this.secretKey).update(stringToSign).digest('hex');
return Buffer.from(rawHmac).toString('base64');
}
this.signature = function(method, uri, hmacDatetime, queryString, payload) {
return this.sign(this.stringToSign(method, uri, hmacDatetime, queryString, payload));
}
this.isValid = function(method, uri, hmacDatetime, queryString, payload, signature) {
let sameSignature = this.signature(method, uri, hmacDatetime, queryString, payload) === signature
let notExpired = (new Date() - new Date(hmacDatetime)) < this.expiresIn // 2.minutes
return sameSignature && notExpired
}
}
signature 생성 예시
샘플 코드
Last updated
Was this helpful?