목표
회원가입, 로그인, 회원조회 기능 구현
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}$/;
- 의미
- /^ : 시작
- 첫문자는 [0~9, a-z, A-Z] 에 있는 문자로 시작
- 다음 구간 ( ) 은 입력된 각각의 문자가 조건 [0~9, a-z, A-Z, _, \.(마침표) , -] 과 매칭되어야한다.
- [ ]+ 의미는 받은 문자에서 주어진 구간 안에 있는 각각의 문자를 앞에 [ ]안에 주어진 표현과 맞는지 모두 체크한다.
- @ 가 있어야 한다
- @ 으로 표현하면 반드시(*) @가 있어야 한다고 강조가능
- ( )에 있는 문자들은 [0~9, a-z, A-Z, _, -]+ 에 각각의 문자가 매칭되어야 한다.
- 다음 구간에서는 . 가 먼저 있어야하고
- 그 다음의 문자들은 [0~9, a-z, A-Z, _, -]+ 에 각각의 문자가 매칭되어야한다.
- {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
- (ex) longest.email.domain.i-ve.ever.seen
- $/ : 문자 끝.
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)
- requestTime 이라는 미들웨어가 있다고 가정, 여기서 현재시간을 req.requestTime에 담는 기능을 한다.
- 여기서 next() 의 역활이 req 에 담겨있는 값을 다음 함수로 넘겨준다.
- 이 미들웨어를 app.get() 에 사용하면
- function 에 있는 req 에 requestTime에서 전달해주는 현재시간 정보 (req.requestTime)가 담겨지게 된다.
- 받은 현재 시간 정보를 이용하여 원하는 코드에 사용가능
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 |