-
REST API 서버 만들기 (7) - 패스워드 암호화 및 JWT 발급하기Server 2020. 4. 10. 00:03
<참고>
REST API 서버 제작 수업을 듣고 포스팅을 하는 게시글 입니다.
서버 개발자가 아니고, 노드를 전문적으로 사용하는 개발자가 아니기에 오류가 있을 수 있습니다.
윈도우로 진행하시는 분들은 콘솔 명령어 수행 시 GitBash 사용을 권장드립니다.
이번 강의에서 작업 할 내용
- 패스워드 암호화 하기
- JWT 발급하기
- Auth 기능 만들기
패스워드 암호화 하기
패스워드를 그대로 DB에 저장을 하게 되면 혹시나 실제 사용중인 서비스 DB가 해킹에 당하면 유저들의 정보를 모두 노출시키게 됩니다.
그럼으로 패스워드를 암호화 하여 저장을 하게 되면 그나마 사용자들의 정보를 안전하게 저장할 수 있습니다.
추가적으로 아주 옛날에는 패스워드 변경보단 찾기라는 기능이 있었지만 점점 시대가 변하면서 패스워드를 변경하는 기능만 생겼습니다.
우선 해시 암호화를 해주는 bcrypt 모듈을 설치해주도록 합시다. `npm install bcrypt`
그리고 user.model.js 를 다음과 같이 수정해주도록 합시다.
beforeSave 함수는 SequelizeModel이 DB에 저장되기 전에 실행되는 함수입니다.
함수가 호출되면 패스워드가 변경되어 있는지 확인을 합니다.
만약 패스워드가 변경되었다면 해시 모듈을 생성하여 암호화 해시를 생성해주도록 합니다. 해시를 10번 반복하여 생성하여 줍시다.
그리고 패스워드를 해시를 이용하여 암호화를 해주도록 합니다.
이제 서버를 키고 클라이언트에서 유저를 등록해보도록 합시다.
성공적으로 유저의 패스워드가 암호화되어 들어갔습니다.
JWT 발급하기
JWT는 Json Web Token 의 약어로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON입니다.
JWT는 . 으로 구분되어 총 3개의 파트로 구성되어 있습니다. [ header.payload.signature ]
Header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다.
Payload는 토큰에 포함할 정보를 가지고 있습니다.
Signature는 해당 토큰을 구분 할 Secret Key를 가지고 있습니다.
이런 JWT를 가지고 아래의 사진과 같이 통신을 합니다.
위와 같은 통신을 하기위한 jwt 모듈을 설치해주도록 합시다. `npm install jsonwebtoken`
jwt를 사용하기 위해서 아래와 같이 파일을 작성해주도록 하고 utils 폴더에 넣어줍니다.
그다음 .env 파일에 아래와 같이 추가를 해주도록 합시다.
###### ## JWT 관련 변수 ###### JWT_SECRET = someRandomString JWT_TTL = 10000
이제 jwt.generate(payload) 를 하게 되면 JWT 토큰을 생성합니다.
jwt.check 하면 서비스 요청의 JWT SECRET이 해당 서버의 SECRET 과 동일한지 확인하고 ture false 를 반환하게 됩니다.
Auth 기능 만들기
JWT 기능을 추가하였으니 이제 Auth 기능을 만들어 보도록 합시다.
아래의 소스를 추가해주도록 합시다.
로그인 요청이 들어오면 id를 기반으로 유저를 검색하고 패스워드를 확인합니다.
만약 모두 일치한다면 JWT 토큰을 생성하여 리스폰스를 던져줍니다.
컨트롤러를 생성하였으니 라우터도 연결 해주도록 합시다.
이제 클라이언트에서 Login을 시도하면 아래와 같이 리스폰스가 들어오게 됩니다!
{ "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjExIiwibmlja25hbWUiOiJ1c2VybmFtZV8xMCIsImlhdCI6MTU4NjQ0MjkyMiwiZXhwIjoxNTg2NDQyOTMyfQ.Rr9M-NN21gNrc43kzbPuBLJHughGJRGym78AG4T4Dqk" } }
이제 해당 토큰을 사용하여 유저조회시 토큰을 사용하도록 미들웨어를 하나 작성하도록 하겠습니다.
아래와 같이 middlewares/v1 폴더에 auth.middleware.js 파일을 하나 생성해주고 아래와 같이 작성을 해주도록 합시다.
이제부터 GET /users/ 메서드를 요청 시 auth.check 후 controller.get 함수를 타게 될 것입니다.
먼저 Request 의 header 안에 authorization 가 없다면 403을 반환합니다.
만약 authorization 이 존재한다면 check 함수를 통해 payload를 가져오고 사용자를 가져옵니다.
위의 middleware를 거치게 되면 request 에 user의 정보가 들어가게 되어 위와 같이 GET 메서드가 매우 깔끔해집니다.
이제 직접 요청을 해보도록 하겠습니다.
'Server' 카테고리의 다른 글
REST API 서버 만들기 (8) - UUID (0) 2020.04.12 REST API 서버 만들기 (6) - CRUD 메서드 만들기 (0) 2020.04.06 REST API 서버 만들기 (5) - Sequelize Model, Migration (0) 2020.04.01 REST API 서버 만들기 (4) - Dotenv, Sequelize 설치 및 세팅하기 (3) 2020.04.01 REST API 서버 만들기 (3) - Router 와 Controller (0) 2020.03.31