목표

회원가입, 로그인, 회원조회 기능 구현

JWT 를 이용해보기

 

구현 시 몰랐던 것들

1. 정규표현식 : email validation check 를 @ 가 빠졌는지 공백있느지를 체크하기

  • split() 을 이용해서 확인이 가능하지만, 이를 정규표현식을 이용해서 구현해보려고 함.
  • 구글링을 통해서 email을 체크하는 정규표현식 찾음
/^([0-9a-zA-Z_\.-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,5}$/
  • 위 표현식으로 하면 이메일을 기입할 때 이 메일 주소의 시작이 -,  _ , . 을 사용해도 유효하다고 판단하게 된다는걸 확인.
    ex)"-test@email.com" 
/^[0-9a-zA-Z]([0-9a-zA-Z_\.-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,5}$/;
  •  의미
    1. /^ : 시작
    2. 첫문자는 [0~9, a-z, A-Z] 에 있는 문자로 시작 
    3. 다음 구간 ( ) 은 입력된 각각의 문자가 조건 [0~9, a-z, A-Z, _, \.(마침표) , -] 과 매칭되어야한다.   
    4.  [ ]+ 의미는 받은 문자에서 주어진 구간 안에 있는 각각의 문자를 앞에  [ ]안에 주어진 표현과 맞는지 모두 체크한다.
    5.  @ 가 있어야 한다
      • @ 으로 표현하면 반드시(*) @가 있어야 한다고 강조가능
    6. ( )에 있는 문자들은 [0~9, a-z, A-Z, _, -]+ 에 각각의 문자가 매칭되어야 한다. 
    7.  다음 구간에서는 . 가 먼저 있어야하고
    8. 그 다음의 문자들은 [0~9, a-z, A-Z, _, -]+  에 각각의 문자가 매칭되어야한다.
    9. {1, 5} 앞과 같은 패턴이 1번에서 5번까지 반복될 수 있다.
      • (ex) longest.email.domain.i-ve.ever.seen
        • 1 번 : longest.email
        • 2 번 : email.domain
        • 3 번 : domain.i-ve
        • 4 번 : i-ve.ever
        • 5 번 : ever.seen 
    10. $/  : 문자 끝.

2. 로그인 기능 구현 시 HTTP Method 선택

  • 첫번째 선택 : GET
    • 선택한 이유 : '로그인' 기능에서 유저의 아이디와 비밀번호가 일치하는 지 조회를 해서 확인다고 생각함.
    • 틀린 이유 : GET method의 의미는 '조회' 이다.  API 입장에서는  '로그인' 이 데이터를 조회하는 것과 거리가 멀다고 판단되어진다.
    • 올바른 선택  : POST HTTP Method

3. HttpException 활용

  • 미들웨어(middleware) 활용법 : 자료출처(Express.com)
  • next() 의 역활
var express = require('express');
var app = express();

var requestTime = function (req, res, next) {
  req.requestTime = Date.now();
  next();
};


app.get('/',requestTime, function (req, res) {
  var responseText = 'Hello World!';
  responseText += 'Requested at: ' + req.requestTime + '';
  res.send(responseText);
});

app.listen(3000)
  1.  requestTime 이라는 미들웨어가 있다고 가정, 여기서 현재시간을 req.requestTime에 담는 기능을 한다.
    • 여기서 next() 의 역활이 req 에 담겨있는 값을 다음 함수로 넘겨준다.
  2.  이 미들웨어를 app.get() 에 사용하면 
    1. function 에 있는 req 에 requestTime에서 전달해주는 현재시간 정보 (req.requestTime)가 담겨지게 된다.
    2. 받은 현재 시간 정보를 이용하여 원하는 코드에 사용가능

3. 코드의미

const token = autherHeader && autherHeader.split(' ')[1];
  •  autherHeader 가 undefined 이면 false 를 반환
  • autherHeader 에 값이 있으면 && 뒤에 코드를 수행

4. 주어진 기능 수행 중 발생한 에러를 응답으로 해야하는 이유

  •  프론트앤드 개발자와 같이 API를 사용해도 프론트앤드 개발자는 콘솔에 나오는 에러를 볼 수가 없다. 그러므로 에러를 Response의 값으로 어떤 에러가 났는지 응답해줘야 한다.

에러발생

  • database 연결할 때 데이터베이스 이름만 적어서 오류를 발생시킴
  • 오류 : Error: secretOrPrivateKey must have a value
    • 오류 발생원인 유추
      • 1. dotenv 를 설치하지 않아지 않았다. ->  설치 된 것 확인
      • 2. .env 에 해당하는 값이 없다. -> 키와 값 확인
      • 3. 해당 코드가 올바르지 않다. -> 확인 올바름 jwt.sign(,,,,)
      • 4. 변수 값 확인 -> 'process.env.JWT_SECRET_KEY' 를 체크 -> undefined
        • .env 에 값이 있는데 왜 undefind 일까... -> 공식문서 확인 ->....설치된 라이브러리를 호출 안함...
    • 원인: 설치된 라이브러리 호출 안함 
      • 라이브러리 호출시 항상 코드의 제일 상단에 할것!!

구현 시 어려웠던 것들

알고 있는 데 계속 기억이 잘 안났던 점

  • Postman 으로 JWT 테스트 할때는 'Bearer' 추가하고 JWT access token 입력
  • JavaScript 에서는 camel 스타일을 사용 하므로 이를 MySQL로 옮길때 이를 underscore 타입으로 변형시켜주는 옵션
    • model 을 설정 다한 후  ,{ underscored:true }  추가!!

'프로그래밍 > Node.js' 카테고리의 다른 글

Swagger 사용방법  (0) 2023.11.30
API 문서를 작성하는 이유  (0) 2023.11.29
비밀번호 암호화하기 기본(단방향)  (0) 2023.11.18
JWT 기본 개념/인증,인가  (0) 2023.11.07
[Sequelize] DB연결 에러  (0) 2023.08.07

+ Recent posts