Skip to content

nodejs Master Key와 possport를 통한 간단한 Basic 인증 구현

인증을 구현하는 방식은 어려가지가 있고 방법도 다양하다.
하지만 아직도 많은 서비스의 인증은 form 데이터를 이용한 아이디/패스워드 방식이 대 부분이다.
SSL을 사용한다면 그나마 다행이지만 기본 http 프로토콜을 사용한다면 사용자의 아이디와 패스워드는 네트워크상에 clear text로 돌아다니게 된다.

이런 보안의 헛점을 보완하기위한 가장 기초 인증 방식인 Basic Auth을 가단한다게 구현하는 방식을 소개한다.

Server

먼저 passport를 설치한다


$npm install passport

그리고 인증 코드를 삽입한다.


passport.use('password', new BasicStrategy((email, password, done) => {
  const userSchema = new Schema({ email: schema.tree.email, password: schema.tree.password })

  userSchema.validate({ email, password }, (err) => {
    if (err) done(err)
  })

  User.findOne({ email }).then((user) => {
    if (!user) {
      done(true)
      return null
    }
    return user.authenticate(password, user.password).then((user) => {
      done(null, user)
      return null
    }).catch(done)
  })
}))

그리고 마스터키를 구현한다.
마스터키는 내가 설정한 클라이언트외에 다른 곳으로부터 요청을 차단해 준다.
마스터키가 분실되면 다른 키를 생성해 클라이언트에 새로 배포하면됩니다.


passport.use('master', new BearerStrategy((token, done) => {
  if (token === '내가 만든키') {
    done(null, {})
  } else {
    done(null, false)
  }
}))

코드는 간단하다 Bearer 방식으로 키를 만들고 키 값이 맞는지 확인하는 작업만 하면된다.

Client

client는 당연히? axios를 사용했다.
여러개의 methods를 제공하며 promise를 반환한다.

https://github.com/axios/axios

호출 코드는 아래와 같다.


const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

instance.({
      method: 'post',
      url : '/auth',
      auth: {
        username: '계정',
        password: '비번'
      },
      // headers: {
      //   'Accept': 'application/json',
      //   'Content-Type': 'application/x-www-form-urlencoded',
      // },
      data: {access_token: '마스터키'}
    }
  ),

구형 클라이언트의 경우 Content-Type을 추가해줘야 해서 주석으로 추가했다.

이제 테스트를 해보자

Curl


curl -X POST http://0.0.0.0:9000/api/v1/auth -i -u 계정:비번 -d "access_token=마스터키"

Postman

인증 타입을 Basic Auth로 선택하고 아이디/패스워드를 입력하면된다.
form-data에 데이터를 넣는 방식이 아니다. (이미지 참조)

이렇게 간단하게 Basic Auth를 구현했다.

소스는 여기에 있다 (내 것이 아니다.)
https://github.com/diegohaz/rest/blob/master/generators/app/templates/services/passport/index.js

Published inNodeJs