포시코딩

2월13일 - 내가 구현한 로직 설명하는 연습하기 - 작성중 본문

TIL

2월13일 - 내가 구현한 로직 설명하는 연습하기 - 작성중

포시 2023. 2. 14. 00:52
728x90

개요

내가 그동안 구현한 로직에 대해 남에게 설명할 상황이 됐을 때

요약해서 설명하기가 매우 힘들다는 사실을 알았다.

 

앞으로 면접을 보게 된다면 분명히 물어볼 사항들에 대해 

대비할 겸 정리를 해보았다.

 

질문 & 답변

로그인 로직

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

 

암호학에서 Salt란? 소금이 필요한 이유

# 솔트 (Salt) 해시 함수를 사용하여 단방향 암호화를 했을때, 언제나 같은 값을 같게 된다. 해커는 잘 알려진 해시값의 원문을 저장해두고 쉽게 원문을 유추할 수 있다. (이렇게 해시함수를 사용

jizard.tistory.com

 

saltRounds?

그럼 salt는 알겠는데 saltRounds는 뭐임?

위에서 설명한대로 salt를 사용해 암호화하는게 예전 같았으면 해독하기 어려웠을텐데

점점 빠르고 저렴해지는(무어의 법칙) 컴퓨팅 자원으로 인해 salting으로도 한계가 오게 되었고

 

이에 대한 해결 방법으로 salting한 hash값에 대해 salt를 붙여 salting 하는걸 반복해

hash 값을 더 추적하기 어렵게 만들기 시작했는데

이 반복 횟수를 salt round라고 한다.

 

https://an-onymous.tistory.com/entry/bcrypt-Hashing%EC%9D%98-%EB%B3%B4%EC%95%88%EC%9D%84-%EB%8D%94-%EB%86%92%EC%9D%B8-Salting-Round

 

[bcrypt] Hashing의 보안을 더 높인 Salting Round

데이터베이스에 회원정보를 보관할 때, MD5같은 해시함수를 사용하면 상당한 보안을 갖출 수 있다. 하지만 유저가 비밀번호를 단순하게 설정한다면 말이 달라진다. 왜냐하면 해시함수는 서로 같

an-onymous.tistory.com

 

무어의 법칙?

반도체의 성능이 대략 2년마다 2배씩 좋아진다는 법칙

 

access token, refresh token 쓰는 이유

 

 

jwt와 access token 차이

 

 

jwt  장점

 

 

jwt의 secret key가 유출된다면?

1. 세션 하이재킹을 당할 수 있다.

해커가 유출된 비밀 키를 사용하여 자체 토큰을 생성하고 사용자 세션을 장악한 뒤

민감한 데이터에 대한 엑세스를 하거나 사용자 대신 작업을 수행하는 상황 발생

소위 말하는 '계정 해킹'이 이루어진다.

 

2. 비밀 키가 유출되면 해당 키를 사용하여 발행된 모든 JWT 토큰의 진위를 더 이상 신뢰할 수 없게 된다.

 

왜 redis에 토큰을 넣는지

 

 

콜백 함수?

 

 

동기/비동기?

 

 

간단하게 얘기한다면

결과값을 동기화 한다면 동기

동기화 하지 않고 결과값을 안기다리고 넘어간다면 비동기

 

테이블에 10개의 컬럼이 있을 때 index는 어디에 거는게 좋을지

 

 

태그형 게시판은 어떻게 만들 수 있을까

 

 

728x90