이런 이런경우 메세지에 있는 포트 번호를 이용하여 사용여부를 확인
Error: listen EADDRINUSE: address already in use ::: 3000
lsof -i:3000
위 코드를 터미널에 입력하면 아래와 같은 결과를 보여준다.
여기서 PID 번호를 이용해서 사용 중인 서버 종료시키기
kill 10287
이런 이런경우 메세지에 있는 포트 번호를 이용하여 사용여부를 확인
Error: listen EADDRINUSE: address already in use ::: 3000
lsof -i:3000
위 코드를 터미널에 입력하면 아래와 같은 결과를 보여준다.
여기서 PID 번호를 이용해서 사용 중인 서버 종료시키기
kill 10287
회원가입, 로그인, 회원조회 기능 구현
JWT 를 이용해보기
1. 정규표현식 : email validation check 를 @ 가 빠졌는지 공백있느지를 체크하기
/^([0-9a-zA-Z_\.-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,5}$/
/^[0-9a-zA-Z]([0-9a-zA-Z_\.-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,5}$/;
2. 로그인 기능 구현 시 HTTP Method 선택
3. HttpException 활용
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)
3. 코드의미
const token = autherHeader && autherHeader.split(' ')[1];
4. 주어진 기능 수행 중 발생한 에러를 응답으로 해야하는 이유
알고 있는 데 계속 기억이 잘 안났던 점
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 |
DB에 나의 비밀번호가 암호화 하지 않고 그대로 저장을 하게 되면,
해커가 DB를 통해서 나의 비밀번호를 알게 되고 나의 계정을 마음대로 사용할 수 있게 되버린다.
이를 막기위해서 비밀번호를 암호화를 한다.
설치 및 생성
// express 프로젝트 생성
npm i init
npm i express
// 암호화 라이브러리 설치
npm i bcrypt
* bcrypt: hash 방식으로 암호화하는 것을 도와주는 라이블러리, password-hashing function
hasing 이란 → 주어진 값을 다른 값으로 변형시키는 것이다. 이때 사용되는 수학적 알고리즘에 따라 변형된 값이 생성된다.
코드 예시
const express = require('express');
const bcrypt = require('bcrypt');
const app = express();
app.use(express.json());
const port = 3000;
const users = [];
// 회원가입
app.post('/sign-up', async (req, res) => {
const { username, password } = req.body;
// 비밀번호 해시화
const saltRounds = 10; // salt: 설정한 password를 복잡하게 변경시키는 것, 이것을 10번 실행
const hashedPassword = await bcrypt.hash(password, saltRounds);
// 임시로 사용자 정보 저장
const newUser = {
username: username,
password: hashedPassword,
};
users.push(newUser);
return res.status(201).send(newUser);
});
// 로그인
app.post('/sign-in', async (req, res) => {
const { username, password } = req.body;
// 등록된 사용자인지 확인
const user = users.find(user => user.username === username);
if (!user) {
return res.status(401).send({ message: '등록되지 않은 사용자입니다.' });
}
// 저장된 해시화된 비밀번호와 입력된 비밀번호 비교
const isPasswordValid = await bcrypt.compare(password, user.password);
if (!isPasswordValid) {
return res.status(401).send({ message: '비밀번호가 일치하지 않습니다.' });
}
// Access Token 발급 로직으로 교체하기
return res.status(200).send({ accessToken: "ACCESS_TOKEN" });
});
app.listen(port, () => {
console.log(`앱이 http://localhost:${port} 에서 실행 중입니다.`);
});
API 문서를 작성하는 이유 (0) | 2023.11.29 |
---|---|
[예제] 인증 및 인가(JWT), 암호화 (1) | 2023.11.19 |
JWT 기본 개념/인증,인가 (0) | 2023.11.07 |
[Sequelize] DB연결 에러 (0) | 2023.08.07 |
[Sequelize] ORM for SQL : 설치 및 DB연결 (0) | 2023.08.07 |
인증에 필요한 방식으로 특정유저가 로그인 할 때, 정말로 인증된 사용자인지 검증할 때 사용.
로그인한 정보가 정말로 인증된 사용자인지 검증할때 사용
/* Header (알고리즘, 토큰 타입)*/
{
"alg": "HS256", // 서명(signature) 생성 시 사용한 해시 알고리즘 : HS256 지원
"typ": "JWT" // 토큰 타입 : < JWT 만 지원>
}
/* Payload (내용, 데이터) */
{
"id": 1,
"iat": 1699358134, // 토큰 발행 시간
"exp": 1700222134 // 토큰 만료 시간 (옵션)
}
/* VERIFY SIGNATURE */
/* header와 payload에 입력된 값을 암호화 하고
secret 부분은 검증(보안서명을 통해 메세지가 전송 과정에서 바뀌지 않은 것을 확인)*/
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
참고자료
https://velog.io/@j_user0719/JWT-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD
[예제] 인증 및 인가(JWT), 암호화 (1) | 2023.11.19 |
---|---|
비밀번호 암호화하기 기본(단방향) (0) | 2023.11.18 |
[Sequelize] DB연결 에러 (0) | 2023.08.07 |
[Sequelize] ORM for SQL : 설치 및 DB연결 (0) | 2023.08.07 |
REST API 설계하여 요청 및 응답하기 : body-parser 이용 (0) | 2023.07.29 |
확인해본 것들
connect ECONNREFUSED ::1:3306 문구에서
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost', // <--- 에러일으킴
dialect: 'mysql'
});
host 수정!!
const sequelize = new Sequelize('database', 'username', 'password', {
host: '127.0.0.1', // <--- 해결
dialect: 'mysql'
});
비밀번호 암호화하기 기본(단방향) (0) | 2023.11.18 |
---|---|
JWT 기본 개념/인증,인가 (0) | 2023.11.07 |
[Sequelize] ORM for SQL : 설치 및 DB연결 (0) | 2023.08.07 |
REST API 설계하여 요청 및 응답하기 : body-parser 이용 (0) | 2023.07.29 |
REST API : 경로 Naming, HTTP Method (0) | 2023.07.26 |