Tedious: Windows ์ธ์ฆ์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„/์•”ํ˜ธ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 08์›” 01์ผ  ยท  17์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: tediousjs/tedious

๊ฐ™์€ ๋„๋ฉ”์ธ์— ์žˆ์–ด๋„ Windows ์ธ์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ด๋ฆ„/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ADO.NET์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ด๋ฆ„/์•”ํ˜ธ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ž๊ฒฉ ์ฆ๋ช… ์ €์žฅ์†Œ์—์„œ Kerberos ํ† ํฐ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ํ˜„์žฌ Tedious์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ Windows ์ธ์ฆ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@arobson @arthurschreiber - ์ œ๋ฐœ ์ƒ๊ฐํ•ด์ฃผ์„ธ์š”.

Follow up Response needed

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” sspi-client๋ฅผ ์ง€๋ฃจํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•จ๊ป˜ ๋˜์กŒ์Šต๋‹ˆ๋‹ค! ntlm, kerberos๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๊ณ  ์•”ํ˜ธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋ณด์•ˆ ํŒจํ‚ค์ง€๋ฅผ ํ˜‘์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

@arthurschreiber ์—ฌ๊ธฐ์—์„œ ํ•ดํ‚น์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ๋“  PR์„ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋†’์€ ์ˆ˜์ค€์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.
https://github.com/tvrprasad/tedious/tree/windows-integrated-auth-draft

๋ชจ๋“  17 ๋Œ“๊ธ€

๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๊ฒƒ์€ Windows ํ†ตํ•ฉ ์ธ์ฆ์— ๋Œ€ํ•œ ์ง€์›์€ SSPI๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  NodeJS๋Š” ํ˜„์žฌ SSPI๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. node-sspi npm ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์„œ๋ฒ„ ์ธก๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ HTTP ์„œ๋ฒ„์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. JavaScript ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก SSPI ๊ตฌํ˜„๋„ JavaScript ๋ฐ”์ธ๋”ฉ์ด ์žˆ๋Š” ๊ธฐ๋ณธ ์ฝ”๋“œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์€ Tedious๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด npm ํŒจํ‚ค์ง€์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก SSPI ์ง€์›์„ ๊ตฌ์ถ•ํ•˜๊ณ  Tedious๊ฐ€ SQL Server Windows ํ†ตํ•ฉ ์ธ์ฆ์šฉ ํŒจํ‚ค์ง€์— ์ข…์†๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์ƒ๊ฐ์ด๋ผ๋„ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์˜ˆ, ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“ˆ์ด ์ง€๋ฃจํ•œ ๋ถ€๋ถ„์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๐Ÿ‘ ๋ณ„๋„์˜ npm ๋ชจ๋“ˆ๋กœ ๊ฐ–๋Š” ์•„์ด๋””์–ด์— ๋Œ€ํ•ด.

๋ฉ‹์žˆ๋Š”. ์ฒซ ๋ฒˆ์งธ ์ปท์€ Windows๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Windows ์ „์šฉ ๊ธฐ๋Šฅ์œผ๋กœ ์‹œ์ž‘ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

Windows์™€ Linux๋Š” Windows ํ†ตํ•ฉ ์ธ์ฆ์„ ์ง€์›ํ•˜๋Š” API๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‘ ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์ง€์›์„ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Windows์™€ Linux์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ข…์†์„ฑ์— ๋Œ€ํ•œ ์„ ๋ก€๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ฉ‹์žˆ๋Š”. ์ฒซ ๋ฒˆ์งธ ์ปท์€ Windows๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Windows ์ „์šฉ ๊ธฐ๋Šฅ์œผ๋กœ ์‹œ์ž‘ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

๊ดœ์ฐฎ์•„. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์„ ํƒ์  ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ฒ˜์Œ์—๋Š” Windows๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๐Ÿ‘

๋‚ด๊ฐ€ ์—ผ๋‘์— ๋‘๊ณ  ์žˆ๋Š” ClientSspi ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์งง์€ ์Šค๋‹ˆํŽซ์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. API์˜ ํ˜•ํƒœ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๊ณต์œ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

ClientSspi = require('ClientSspi');

serverName = 'servername.example.com';

// Server name should be the only configuration. Windows SSPI APIs will get
// the tokens to be presented to the server to authenticate the logged in user.
clientSspi = new ClientSspi(serverName);

// authprotocol parameter can take three values.
// Negotiate, Kerberos, Ntlm
// Negotiate: With this option client will negotiate with the server
// on security protocol using SPNEGO.
//
// If nothing is specified, the first supported protocol will be used. The
// protocols will be attempted in the sequence listed above.
clientSspi.initialize(authprotocol, function(errorCode, errorString) {
  if (errorCode || errorString) {
    throw('SSPI intialization failed: ', errorCode, ': ', errorString);
  }

  var sspiServerResponse = new Uint8Array([]);
  var sspiDone = false;

  while (!sspiDone) {
    // This call gets the next set of bytes to send to the server as part of the
    // SSPI dance.
    clientSspi.getNextSspiBlob(sspiServerResponse, function (sspiClientResponse, isDone, errorCode, errorString) {
      if (errorCode || errorString) {
        throw('SSPI intialization failed: ', errorCode, ': ', errorString);
      }

      sspiDone = isDone;

      // This function will send the sspiClientResponse to the server and invokes the
      // callback when the response from the server becomes available.
      SendSspiBlobToSqlServerAndGetResponse(sspiClientResponse, function (serverResponse, errorString) {
        if (errorString) {
          throw(errorString);
        }

        sspiServerResponse = serverResponse;
      });
    });
  }
});

https://github.com/tvrprasad/sspi-client์— API์˜ ์Šคํ… ๊ตฌํ˜„์ด

@arthurschreiber ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ๋น ๋ฅด๊ฒŒ ํŒจ์Šคํ•ด์ฃผ์„ธ์š”. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์ด๋‚˜ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๋ฅผ ์ €์—๊ฒŒ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ๊ตฌํ˜„์„ ์ฑ„์šฐ๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Tedious์—์„œ Windows ํ†ตํ•ฉ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” sspi-client๋ฅผ ์ง€๋ฃจํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•จ๊ป˜ ๋˜์กŒ์Šต๋‹ˆ๋‹ค! ntlm, kerberos๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๊ณ  ์•”ํ˜ธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋ณด์•ˆ ํŒจํ‚ค์ง€๋ฅผ ํ˜‘์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

@arthurschreiber ์—ฌ๊ธฐ์—์„œ ํ•ดํ‚น์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ๋“  PR์„ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋†’์€ ์ˆ˜์ค€์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.
https://github.com/tvrprasad/tedious/tree/windows-integrated-auth-draft

์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์–ด Windows ํ†ตํ•ฉ ์ธ์ฆ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ€๋Šฅํ•ด์งˆ ๋•Œ๊นŒ์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€

@v-suhame ์ด๊ฒƒ์˜ ์ตœ์‹  ์ •๋ณด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? #624๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์‹ญ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์„ ์›€์ง์ด๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ตœ์‹  ์—…๋ฐ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ @arthurschreiber์— ๋ฐ˜๋ณต ๋„์›€์— ์ œ์•ˆ ๐Ÿ˜ƒ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ๋ฅผ @kevinkuszyk.

Linux ์„œ๋ฒ„์—์„œ Windows ํ†ตํ•ฉ ์ธ์ฆ์„ ์ง€๊ธˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@sxpati2 Windows ํ†ตํ•ฉ ์ธ์ฆ์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Windows OS์šฉ์ž…๋‹ˆ๋‹ค. Linux์˜ ๊ฒฝ์šฐ Kerberos ํ†ตํ•ฉ ์ธ์ฆ์ด ๋ฉ๋‹ˆ๋‹ค. Tedious๋Š” ํ˜„์žฌ Windows ๋˜๋Š” Kerberos ํ†ตํ•ฉ ์ธ์ฆ์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ–ฅํ›„ ๊ณ„ํš์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋Œ€๋Œ€์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. msnodesqlv8์„ ์ง€๋ฃจํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” msnodesqlv8์ด ์†ํŽธํ™”์— ๋น ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@arthurschreiber ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ์ฐฝ ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•œ PR #497 Windows ํ†ตํ•ฉ ์ธ์ฆ์ด ๋ณ‘ํ•ฉ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ง€๋ฃจํ•œ ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” ๋” ์ด์ƒ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹œ์ฃ ?

๊ทธ ์ดํ›„๋กœ ์ƒํ™ฉ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ๋ฆฌํŒฉํ„ฐ๋ง์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์†์‹ค๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๊ทธ ์ดํ›„๋กœ ์ƒํ™ฉ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ๋ฆฌํŒฉํ„ฐ๋ง์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์†์‹ค๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์ €๋„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ๋‹จ์–ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰