티스토리 뷰

Coding Study/Javascript/Node

express-subdomain 사용법

:3inddlown Leaf 2022. 2. 22. 23:08
728x90

express-subdomain를 사용하여 서브도메인 라우팅 방법을 알아보겠습니다.

 

express-subdomain

express-subdomain은 subdomain 라우팅을 도와주는 express 미들웨어입니다. npm, github repository

제공되는 사용법과 github에 있는 테스트 코드로도 사용하는데 큰 어려움이 없지만, 몇 가지 중요한 내용을 포함해서 글을 적어보도록 하겠습니다.

 

 

1. Install

express-subdomain 패키지를 설치합니다.

 

- npm

npm i express-subdomain

- yarn

yarn add express-subdomain

 

 

2. import

설치한 패키지를 알맞은 방법으로 불러와줍니다.

이때 불러오는 이름은 subdomain과 달라도 상관없습니다.

 

commonjs

const subdomain = require('express-subdomain')

es6

import subdomain from 'express-subdomain'

 

 

3. subdomain offset

다음으로 subdomain offset을 설정해줘야 합니다.

express 4.x API reference에 정의된 subdomain offset의 뜻은 다음과 같습니다.

The number of dot-separated parts of the host to remove to access subdomain.
서브도메인에 액세스하기 위해 제거할 호스트의 점으로 구분된 부분 수입니다.

 

즉, api.example.co.kr의 경우, subdomain을 추출하기 위해 제거할 부분은 example.co.kr입니다.

이는 점을 기준으로 세 부분으로 구분되었으므로 subdomain offset값을 3으로 설정해야 합니다.

 

예를 들어 3으로 설정해보겠습니다.

app.set('subdomain offset', 3)

 

더보기
더보기

이렇게 복잡하게 설정해야 하는 이유가 궁금한 분들을 위해 추가적으로 설명해드리겠습니다.

아래는 express의 request.js파일의 일부입니다.

defineGetter(req, 'subdomains', function subdomains() {
  var hostname = this.hostname;

  if (!hostname) return [];

  var offset = this.app.get('subdomain offset');
  var subdomains = !isIP(hostname)
    ? hostname.split('.').reverse()
    : [hostname];

  return subdomains.slice(offset);
});

 

ip주소로 접근한 것이 아닌 url로 접근했을 때, 7행에서 hostname.split('.'). reverse()로 hostname을. 기준으로 나눕니다.

hostnameapi.example.co.kr 일subdomain[ "kr", "co", "example", "api" ]가 된 것이죠.

그리고 10행에서 subdomain.slice(offset)으로 불필요한 부분을 제거됩니다.

[ "kr", "co", "example", "api" ]에서 subdomain을 추출하기 위해 slice(3)를 해줘야 합니다. 이때 3이 offset입니다.

 

 

4. 라우터 등록

express-subdomain은 서브도메인과 라우터를 연결시켜줍니다.

라우터를 만드는 방법은 이번 글의 주제와 벗어나는 내용이기 때문에 따로 설명은 하지 않겠습니다.

추가적인 공부가 필요한 경우, 여기를 통해 학습해주시기 바랍니다.

 

아래는 제가 간단히 제작해본 api라우터입니다.

/* api.js */

import { Router } from 'express'

const api = Router()

api.get('/', (req, res) => {
  res.send('api home')
})

export default api

 

이 라우터를 api서브도메인과 연결시켜보겠습니다.

app.use(subdomain('api', api))

 

물론 라우터를 사용하지 않고 순수 미들웨어로 사용할 수도 있습니다.

app.use(subdomain('api', (req, res, next) => {
    return res.send('blog home')
}))

 

 

wildcard

subdomain에 wildcard를 적용할 수 있습니다.

위에서 사용한 코드를 약간 수정하여 모든 api버전에 대한 사용자 유효성 검사를 실시하도록 한 예제입니다.

const checkUser = subdomain('*.api', (req, res, next) => {
    if(!req.session.user.valid) {
        return res.send('Permission denied.')
    }
    next()
})
 
app.use(checkUser) // 미들웨어 순서 주의
app.use(subdomain('v1.api', api1))
app.use(subdomain('v2.api', api2))

 

 

5. result

최종적인 코드는 여기(github)에서 확인할 수 있습니다.

import express from 'express'
// 페키지 로드
import subdomain from 'express-subdomain'

// imports routers
import api from './routers/api.js'
import blog from './routers/blog.js'

const PORT = process.env.PORT || 3000
const app = express()

// Sets the subdomain offset to one more than the number of points in the host name.
// ex) localhost -> 1  example.com -> 2
app.set('subdomain offset', 1)

// register subdomain
app.use(subdomain('api', api))
// app.use(subdomain('blog', blog))
// now we can access api.localhost (and blog.localhost)

app.listen(PORT, () => console.log('server is running on port ' + PORT))

 

 

6. 어떻나요?

서브도메인 라우팅은 vhost를 통해서도 할 수 있습니다.

그리고 실제로도 express-subdomain보다 vhost가 더 많이 사용되고 있습니다. 비교

하지만 간단하게 사용하려면 express-subdomain도 나쁘지 않은 선택지가 될 수 있을 것 같네요.

 

혹시 부족한 설명이나 애매한 표현 등을 댓글로 남겨주시면 바로 수정하겠습니다!

반응형

'Coding Study > Javascript/Node' 카테고리의 다른 글

[Node.js] __dirname의 상위 디렉터리 접근  (0) 2021.09.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함