목차
前置知识
accept-encoding
content-encoding
deflate/gzip/br
zlib模块
文件的解/压缩
基于流(stream)的操作
基于Buffer的操作
다음 클라이언트는 모두 브라우저를 참조합니다" >사전 지식

다음 클라이언트는 모두 브라우저를 참조합니다

콘텐츠 인코딩
stream
基于流(stream)操作
基于Buffer操作
Node Server中的实践
BrotliCompress
测试数据
404: ${url}
已注册路由
웹 프론트엔드 JS 튜토리얼 실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

Mar 08, 2022 pm 08:00 PM
node

Nodejs를 사용하여 콘텐츠 압축을 달성하는 방법은 무엇입니까? 다음 글에서는 Node 측에서 컨텐츠 압축(gzip/br/deflate)을 구현하는 방법에 대해 실습을 통해 이야기해보겠습니다.

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

application로그를 확인할 때 로그 페이지에 들어간 후 로드하는 데 항상 몇 초가 걸린다는 사실을 발견했습니다(인터페이스는 페이지가 매겨져 있지 않았습니다). 그래서 네트워크 패널을 열어

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.를 확인했습니다.

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

이제서야 인터페이스에서 반환된 데이터가 압축되지 않은 것을 발견했습니다. 인터페이스가 Nginx 역방향 프록시를 사용하고 Nginx가 자동으로 이 레이어를 수행하는 데 도움이 될 것이라고 생각했습니다. 이론적으로 가능함)

여기 백엔드는 Node Service

이 기사에서는 HTTP 데이터 압축에 대한 지식과 노드 측HTTP数据压缩相关知识以及在Node侧的实践

前置知识

下面的客户端均指浏览器

accept-encoding

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

客户端在向服务端发起请求时,会在请求头(request header)中添加accept-encoding字段,其值标明客户端支持的压缩内容编码格式

content-encoding

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

服务端在对返回内容执行压缩后,通过在响应头(response header)中添加content-encoding,来告诉浏览器内容实际压缩使用的编码算法

deflate/gzip/br

deflate是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。

gzip 是基于 DEFLATE 的算法

br指代Brotli,该数据格式旨在进一步提高压缩比,对文本的压缩相对deflate能增加20%的压缩密度,而其压缩与解压缩速度则大致不变

zlib模块

Node.js包含一个zlib 模块,提供了使用 GzipDeflate/Inflate、以及 Brotli 实现的压缩功能

这里以gzip为例分场景列举多种使用方式,Deflate/InflateBrotli使用方式一样,只是API不一样

基于stream的操作

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

基于buffer的操作

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

引入几个所需的模块

const zlib = require('zlib')
const fs = require('fs')
const stream = require('stream')
const testFile = 'tests/origin.log'
const targetFile = `${testFile}.gz`
const decodeFile = `${testFile}.un.gz`
로그인 후 복사

文件的解/压缩

解/压缩结果查看,这里使用du指令直接统计解压缩前后结果

# 执行
du -ah tests

# 结果如下
108K    tests/origin.log.gz
2.2M    tests/origin.log
2.2M    tests/origin.log.un.gz
4.6M    tests
로그인 후 복사

基于流(stream)的操作

使用createGzipcreateUnzip

  • 注:所有 zlib API,除了那些显式同步的 API,都使用 Node.js 内部线程池,可以看做是异步的
  • 因此下面的示例中的压缩和解压代码应分开执行,否则会报错

方式1: 直接利用实例上的pipe方法传递流

// 压缩
const readStream = fs.createReadStream(testFile)
const writeStream = fs.createWriteStream(targetFile)
readStream.pipe(zlib.createGzip()).pipe(writeStream)

// 解压
const readStream = fs.createReadStream(targetFile)
const writeStream = fs.createWriteStream(decodeFile)
readStream.pipe(zlib.createUnzip()).pipe(writeStream)
로그인 후 복사

方式2: 利用stream上的pipeline,可在回掉中单独做其它的处理

// 压缩
const readStream = fs.createReadStream(testFile)
const writeStream = fs.createWriteStream(targetFile)
stream.pipeline(readStream, zlib.createGzip(), writeStream, err => {
    if (err) {
        console.error(err);
    }
})

// 解压
const readStream = fs.createReadStream(targetFile)
const writeStream = fs.createWriteStream(decodeFile)
stream.pipeline(readStream, zlib.createUnzip(), writeStream, err => {
    if (err) {
        console.error(err);
    }
})
로그인 후 복사

方式3: Promise化pipeline方法

const { promisify } = require('util')
const pipeline = promisify(stream.pipeline)

// 压缩
const readStream = fs.createReadStream(testFile)
const writeStream = fs.createWriteStream(targetFile)
pipeline(readStream, zlib.createGzip(), writeStream)
    .catch(err => {
        console.error(err);
    })

// 解压
const readStream = fs.createReadStream(targetFile)
const writeStream = fs.createWriteStream(decodeFile)
pipeline(readStream, zlib.createUnzip(), writeStream)
    .catch(err => {
        console.error(err);
    })
로그인 후 복사

基于Buffer的操作

利用 gzipunzip API,这两个方法包含同步异步类型

  • 压缩
    • gzip
    • gzipSync
  • 解压
    • unzip
    • unzipSync

方式1:readStreamBuffer,然后进行进一步操作

  • gzip:异步
// 压缩
const buff = []
readStream.on('data', (chunk) => {
    buff.push(chunk)
})
readStream.on('end', () => {
    zlib.gzip(Buffer.concat(buff), targetFile, (err, resBuff) => {
        if(err){
            console.error(err);
            process.exit()
        }
        fs.writeFileSync(targetFile,resBuff)
    })
})
로그인 후 복사
  • gzipSync:同步
// 压缩
const buff = []
readStream.on('data', (chunk) => {
    buff.push(chunk)
})
readStream.on('end', () => {
    fs.writeFileSync(targetFile,zlib.gzipSync(Buffer.concat(buff)))
})
로그인 후 복사

方式2: 直接通过readFileSync

사전 지식

다음 클라이언트는 모두 브라우저를 참조합니다

accept-encoding

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

🎜클라이언트가 서버에 대한 요청을 시작하면 요청 헤더가 포함됩니다. (요청 헤더)에 accept-encoding 필드를 추가합니다. 이 필드의 값은 클라이언트의 지원되는 압축 콘텐츠 인코딩 형식을 나타냅니다. 🎜

콘텐츠 인코딩

🎜실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.🎜🎜서버는 반환된 콘텐츠에 대해 압축을 수행한 후 콘텐츠를 추가하여 브라우저 콘텐츠에 <code>실제 압축에 사용되는 인코딩 알고리즘<을 알려줍니다. -encoding을 응답 헤더에 추가합니다. /code>🎜

deflate/gzip/br

🎜deflateLZ77 알고리즘과 Huffman Coding은 무손실 데이터 압축 알고리즘입니다. 🎜🎜gzipDEFLATE를 기반으로 한 알고리즘입니다. 🎜🎜brBrotli를 의미합니다. 압축 비율을 더욱 향상시키기 위해 텍스트 압축은 deflate에 비해 압축 밀도를 20% 높일 수 있으며 압축 및 압축 해제 속도는 거의 동일하게 유지됩니다🎜

zlib 모듈 🎜🎜Node.js에는 Gzip, Deflate/Inflate 사용을 제공하는 zlib 모듈이 포함되어 있습니다. , Brotli에서 구현한 압축 기능🎜🎜여기에서는 시나리오에 따른 다양한 사용 방법을 나열하기 위해 gzip을 예로 들어 Deflate/InflateBrotli사용법은 같지만 API가 다릅니다🎜🎜스트림 기반 작업🎜🎜실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.🎜🎜버퍼 기반 작업</ 코드></strong>🎜🎜<img src="https://img.php.cn/upload/image/734/331/536/164674055924407실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다." title="164674055924407실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다." alt="실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다. "/>🎜🎜몇 가지 필수 모듈 소개 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// 压缩 const readBuffer = fs.readFileSync(testFile) const decodeBuffer = zlib.gzipSync(readBuffer) fs.writeFileSync(targetFile,decodeBuffer) // 解压 const readBuffer = fs.readFileSync(targetFile) const decodeBuffer = zlib.gzipSync(decodeFile) fs.writeFileSync(targetFile,decodeBuffer)</pre><div class="contentsignin">로그인 후 복사</div></div><h2 data-id="heading-6">파일 압축 해제/압축🎜🎜압축 해제/압축 결과 보기, 여기에서 <code>du 명령을 사용하여 직접 계산 압축 풀기 전과 후의 결과🎜
// 测试数据
const testData = fs.readFileSync(testFile, { encoding: &#39;utf-8&#39; })
로그인 후 복사
로그인 후 복사

stream

기반 작업🎜createGzipcreateUnzip 사용 🎜
  • 참고: 명시적으로 동기식을 제외한 모든 zlib API는 Node.js 내부 스레드 풀을 사용하며 비동기식으로 간주될 수 있습니다.
  • 그래서 다음 예제의 압축 및 압축 풀기 코드는 별도로 실행되어야 합니다. 그렇지 않으면 오류가 보고됩니다.
🎜방법 1: 파이프</code를 직접 사용합니다. > 스트림을 전달하기 위한 인스턴스의 메소드🎜 <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>const buffer = Buffer.from(testData)</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜<strong>방법 2:</strong> <code>스트림파이프라인을 사용하면 스트림 중에 별도로 다른 처리를 수행할 수 있습니다. Rollback🎜
const transformStream = new stream.PassThrough()
transformStream.write(buffer)

// or
const transformStream = new stream.Duplex()
transformStream.push(Buffer.from(testData))
transformStream.push(null)
로그인 후 복사
로그인 후 복사
🎜방법 3 : 파이프라인 메소드 약속🎜
transformStream
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream(targetFile))
로그인 후 복사
로그인 후 복사

버퍼 기반 작업< /h3>🎜 gzipunzip API를 활용하세요. 이 두 가지 방법에는 동기비동기 유형이 포함됩니다🎜
  • 압축
    • gzip
    • gzipSync
  • 압축 해제< ul>
  • unzip
  • unzipSync
🎜방법 1 : readStream버퍼로 지정한 다음 추가 작업을 수행합니다🎜
  • gzip: 비동기
const buffer = Buffer.from(testData)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • gzipSync: 동기화됨< /li>
const result = zlib.gzipSync(buffer)
로그인 후 복사
로그인 후 복사
🎜방법 2: readFileSync🎜🎜In을 통해 직접 텍스트 콘텐츠의 🎜
fs.writeFileSync(targetFile, result)
로그인 후 복사
로그인 후 복사
🎜압축 풀기/압축 읽기 파일 압축 외에도 때로는 전송된 콘텐츠의 압축을 직접 풀기 위해🎜

这里以压缩文本内容为例

// 测试数据
const testData = fs.readFileSync(testFile, { encoding: &#39;utf-8&#39; })
로그인 후 복사
로그인 후 복사

基于流(stream)操作

这块就考虑 string => buffer => stream的转换就行

string => buffer

const buffer = Buffer.from(testData)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

buffer => stream

const transformStream = new stream.PassThrough()
transformStream.write(buffer)

// or
const transformStream = new stream.Duplex()
transformStream.push(Buffer.from(testData))
transformStream.push(null)
로그인 후 복사
로그인 후 복사

这里以写入到文件示例,当然也可以写到其它的流里,如HTTP的Response(后面会单独介绍)

transformStream
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream(targetFile))
로그인 후 복사
로그인 후 복사

基于Buffer操作

同样利用Buffer.from将字符串转buffer

const buffer = Buffer.from(testData)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

然后直接使用同步API进行转换,这里result就是压缩后的内容

const result = zlib.gzipSync(buffer)
로그인 후 복사
로그인 후 복사

可以写入文件,在HTTP Server中也可直接对压缩后的内容进行返回

fs.writeFileSync(targetFile, result)
로그인 후 복사
로그인 후 복사

Node Server中的实践

这里直接使用Node中 http 模块创建一个简单的 Server 进行演示

在其他的 Node Web 框架中,处理思路类似,当然一般也有现成的插件,一键接入

실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.

const http = require(&#39;http&#39;)
const { PassThrough, pipeline } = require(&#39;stream&#39;)
const zlib = require(&#39;zlib&#39;)

// 测试数据
const testTxt = &#39;测试数据123&#39;.repeat(1000)

const app = http.createServer((req, res) => {
    const { url } = req
    // 读取支持的压缩算法
    const acceptEncoding = req.headers[&#39;accept-encoding&#39;].match(/(br|deflate|gzip)/g)

    // 默认响应的数据类型
    res.setHeader(&#39;Content-Type&#39;, &#39;application/json; charset=utf-8&#39;)

    // 几个示例的路由
    const routes = [
        [&#39;/gzip&#39;, () => {
            if (acceptEncoding.includes(&#39;gzip&#39;)) {
                res.setHeader(&#39;content-encoding&#39;, &#39;gzip&#39;)
                // 使用同步API直接压缩文本内容
                res.end(zlib.gzipSync(Buffer.from(testTxt)))
                return
            }
            res.end(testTxt)
        }],
        [&#39;/deflate&#39;, () => {
            if (acceptEncoding.includes(&#39;deflate&#39;)) {
                res.setHeader(&#39;content-encoding&#39;, &#39;deflate&#39;)
                // 基于流的单次操作
                const originStream = new PassThrough()
                originStream.write(Buffer.from(testTxt))
                originStream.pipe(zlib.createDeflate()).pipe(res)
                originStream.end()
                return
            }
            res.end(testTxt)
        }],
        [&#39;/br&#39;, () => {
            if (acceptEncoding.includes(&#39;br&#39;)) {
                res.setHeader(&#39;content-encoding&#39;, &#39;br&#39;)
                res.setHeader(&#39;Content-Type&#39;, &#39;text/html; charset=utf-8&#39;)
                // 基于流的多次写操作
                const originStream = new PassThrough()
                pipeline(originStream, zlib.createBrotliCompress(), res, (err) => {
                    if (err) {
                        console.error(err);
                    }
                })
                originStream.write(Buffer.from(&#39;<h1 id="BrotliCompress">BrotliCompress</h1>&#39;))
                originStream.write(Buffer.from(&#39;<h2 id="测试数据">测试数据</h2>&#39;))
                originStream.write(Buffer.from(testTxt))
                originStream.end()
                return
            }
            res.end(testTxt)
        }]
    ]
    const route = routes.find(v => url.startsWith(v[0]))
    if (route) {
        route[1]()
        return
    }

    // 兜底
    res.setHeader(&#39;Content-Type&#39;, &#39;text/html; charset=utf-8&#39;)
    res.end(`<h1 id="nbsp-url">404: ${url}</h1>
    <h2 id="已注册路由">已注册路由</h2>
    <ul>
        ${routes.map(r => `<li><a href="${r[0]}">${r[0]}</a></li>`).join(&#39;&#39;)}
    </ul>
    `)
    res.end()
})

app.listen(3000)
로그인 후 복사

更多node相关知识,请访问:nodejs 教程

위 내용은 실습을 통해 Node를 사용하여 콘텐츠 압축을 달성하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

nvm에서 노드를 삭제하는 방법 nvm에서 노드를 삭제하는 방법 Dec 29, 2022 am 10:07 AM

nvm을 사용하여 노드를 삭제하는 방법: 1. "nvm-setup.zip"을 다운로드하여 C 드라이브에 설치합니다. 2. "nvm -v" 명령을 통해 환경 변수를 구성하고 버전 번호를 확인합니다. install" 명령 노드 설치; 4. "nvm uninstall" 명령을 통해 설치된 노드를 삭제합니다.

Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법 Mar 28, 2023 pm 07:28 PM

파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

Node 서비스의 Docker 미러링을 수행하는 방법은 무엇입니까? 극한 최적화에 대한 자세한 설명 Node 서비스의 Docker 미러링을 수행하는 방법은 무엇입니까? 극한 최적화에 대한 자세한 설명 Oct 19, 2022 pm 07:38 PM

이 기간 동안 저는 Tencent 문서의 모든 카테고리에 공통되는 HTML 동적 서비스를 개발 중입니다. 다양한 카테고리에 대한 액세스 생성 및 배포를 촉진하고 클라우드로 이동하는 추세에 부응하기 위해. Docker를 사용하여 서비스 콘텐츠를 수정하고 제품 버전을 균일하게 관리합니다. 이 글에서는 제가 Docker를 서비스하면서 쌓은 최적화 경험을 여러분의 참고용으로 공유하겠습니다.

Node의 프로세스 관리 도구 'pm2”에 대한 심층 분석 Node의 프로세스 관리 도구 'pm2”에 대한 심층 분석 Apr 03, 2023 pm 06:02 PM

이 기사에서는 Node의 프로세스 관리 도구인 "pm2"를 공유하고 pm2가 필요한 이유, pm2 설치 및 사용 방법에 대해 설명합니다. 모두에게 도움이 되기를 바랍니다!

PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? Mar 05, 2025 pm 05:57 PM

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

pkg를 사용하여 Node.js 프로젝트를 실행 파일로 패키징하는 방법에 대해 이야기해 보겠습니다. pkg를 사용하여 Node.js 프로젝트를 실행 파일로 패키징하는 방법에 대해 이야기해 보겠습니다. Dec 02, 2022 pm 09:06 PM

nodejs 실행 파일을 pkg로 패키징하는 방법은 무엇입니까? 다음 기사에서는 pkg를 사용하여 Node 프로젝트를 실행 파일로 패키징하는 방법을 소개합니다. 도움이 되기를 바랍니다.

npm node gyp가 실패하는 경우 수행할 작업 npm node gyp가 실패하는 경우 수행할 작업 Dec 29, 2022 pm 02:42 PM

"node-gyp.js"와 "Node.js"의 버전이 일치하지 않아 npm node gyp가 실패했습니다. 해결 방법: 1. "npm 캐시 clean -f"를 통해 노드 캐시를 지웁니다. 2. "npm install - g n" n 모듈을 설치합니다. 3. "n v12.21.0" 명령을 통해 "node v12.21.0" 버전을 설치합니다.

싱글 사인온(SSO) 시스템이란 무엇입니까? nodejs를 사용하여 구현하는 방법은 무엇입니까? 싱글 사인온(SSO) 시스템이란 무엇입니까? nodejs를 사용하여 구현하는 방법은 무엇입니까? Feb 24, 2023 pm 07:33 PM

싱글 사인온(SSO) 시스템이란 무엇입니까? nodejs를 사용하여 구현하는 방법은 무엇입니까? 다음 글에서는 Node를 사용하여 Single Sign-On 시스템을 구현하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

See all articles