일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Dinosaur
- 게임
- typeORM
- Nest.js
- game
- class
- nestjs
- Express
- mongoose
- GIT
- 공룡게임
- dfs
- flask
- nodejs
- OCR
- Bull
- MongoDB
- TypeScript
- JavaScript
- Queue
- MySQL
- 정렬
- AWS
- 자료구조
- Sequelize
- react
- Python
- jest
- cookie
- Today
- Total
포시코딩
2월13일 - 내가 구현한 로직 설명하는 연습하기 - 작성중 본문
개요
내가 그동안 구현한 로직에 대해 남에게 설명할 상황이 됐을 때
요약해서 설명하기가 매우 힘들다는 사실을 알았다.
앞으로 면접을 보게 된다면 분명히 물어볼 사항들에 대해
대비할 겸 정리를 해보았다.
질문 & 답변
로그인 로직
login = async (account, password) => {
try {
const admin = await this.findOneByAccount(account);
if (!admin) {
return { code: 401, message: '잘못된 관리자 정보' };
}
if (!(await comparePasswordForLogin(password, admin.password))) {
return { code: 401, message: '잘못된 관리자 정보' };
}
const accessToken = await createAccessToken(admin.id);
const refreshToken = await createRefreshToken();
if ((accessToken === undefined) | (refreshToken === undefined)) {
throw new Error('token 생성 실패');
}
await this.redisUtil.set(refreshToken, admin.id);
return {
code: 200,
simpleAdminInfo: {
id: admin.id,
account: admin.account,
},
accessToken,
refreshToken,
message: '로그인 성공',
};
} catch (err) {
return { code: 500, message: '로그인 실패' };
}
};
일단 이게 내 로그인 로직.
유저정보 받아와서 유저 있는지 체크, 암호화한 비밀번호 체크
이상없다면 유저의 index 값으로 jwt를 통해 access token 생성
refresh token 도 생성 후 redis에 유저의 index값을 value 삼아 저장한다.
그 후 access token, refresh token을 client에 보내주며 로직 끝
bcrypt 쓴 이유 암호화는 어떻게?
암호화 해시 함수로서 현재까지 가장 강력한 해시 알고리즘 중 하나인데다
사용법이 매우 간단하기 때문에 사용했다.
안전한 암호화를 위해 salt 값을 사용했다. -> 잘못된 지식
bcrypt는 자체적으로 내부에서 salt를 랜덤으로 만든다.
내가 salt라고 생각하고 사용했던건 saltRounds였음
이에 따라 개발자는 암호화시킬 패스워드와 saltRounds만 전달해주면
bcrypt가 자체적으로 salt를 생성해 전달 받은 반복 횟수만큼 해싱 시켜 반환하게 된다.
여기서 salt를 내부에서 랜덤으로 생성하기 때문에
같은 패스워드에 대해서도 다 다른 암호화된 값이 나오게 되고
여기에 saltRounds까지 추가되니 더더욱 해독하기 어려워지게 된다.
정리하자면
bcrypt는 가장 강력한 해시 알고리즘인데다 사용 방법도 쉽고
내부에서 자체적으로 salt를 생성하기 때문에 saltRounds값만 패스워드와 함께 전달해줘도
강력한 암호화 hash값을 얻을 수 있어 보안상으로도 안전해 사용했다.
salt?
해시 함수를 사용해 단방향 암호화를 하면 항상 같은 값을 얻게 되는데
해커는 잘 알려진 해시값의 원문을 저장해두고 쉽게 원문을 유추할 수 있다고 한다.
(이렇게 원문들을 저장해둔 테이블을 레인보우 테이블이라고 부른다.)
때문에 비밀번호에 특정 문자를 추가해 암호화를 한다면
이 유추 방법 사용해 원문을 유추하기 어렵게 만드는데
이 특정 문자를 salt(소금)라고 부르며 이러한 행위를 salt 친다. 말 그대로 소금을 친다 라고 표현한다.
https://jizard.tistory.com/340
saltRounds?
그럼 salt는 알겠는데 saltRounds는 뭐임?
위에서 설명한대로 salt를 사용해 암호화하는게 예전 같았으면 해독하기 어려웠을텐데
점점 빠르고 저렴해지는(무어의 법칙) 컴퓨팅 자원으로 인해 salting으로도 한계가 오게 되었고
이에 대한 해결 방법으로 salting한 hash값에 대해 salt를 붙여 salting 하는걸 반복해
hash 값을 더 추적하기 어렵게 만들기 시작했는데
이 반복 횟수를 salt round라고 한다.
무어의 법칙?
반도체의 성능이 대략 2년마다 2배씩 좋아진다는 법칙
access token, refresh token 쓰는 이유
jwt와 access token 차이
jwt 장점
jwt의 secret key가 유출된다면?
1. 세션 하이재킹을 당할 수 있다.
해커가 유출된 비밀 키를 사용하여 자체 토큰을 생성하고 사용자 세션을 장악한 뒤
민감한 데이터에 대한 엑세스를 하거나 사용자 대신 작업을 수행하는 상황 발생
소위 말하는 '계정 해킹'이 이루어진다.
2. 비밀 키가 유출되면 해당 키를 사용하여 발행된 모든 JWT 토큰의 진위를 더 이상 신뢰할 수 없게 된다.
왜 redis에 토큰을 넣는지
콜백 함수?
동기/비동기?
간단하게 얘기한다면
결과값을 동기화 한다면 동기
동기화 하지 않고 결과값을 안기다리고 넘어간다면 비동기
테이블에 10개의 컬럼이 있을 때 index는 어디에 거는게 좋을지
태그형 게시판은 어떻게 만들 수 있을까
'TIL' 카테고리의 다른 글
2월15일 - Nest.js에서의 CORS (0) | 2023.02.15 |
---|---|
2월14일 - JavaScript 전개구문을 통해 Object 합치기 (0) | 2023.02.14 |
2월12일 - JavaScript navigator.mediaDevices를 통한 카메라 제어 (0) | 2023.02.12 |
2월10일 - JSDoc (0) | 2023.02.10 |
2월9일 - IoC와 DI - DIP 관련 작성중 (0) | 2023.02.09 |