엘리스 SW 엔지니어 트랙/Project

관리자 권한을 가진 jwt 토큰이 탈취된다면?

wookhyung 2022. 6. 1. 23:03
728x90

관리자 권한을 가진 토큰이 탈취된다면 어떻게 될까?

 

오늘 오피스아워 시간에 백엔드 코치님에게 어드민 검증 미들웨어와 관련된 조언을 들었는데, 먼저 현재 프로젝트 내에서는 jwt 토큰 안에 유저의 objectId와 role(일반 유저, 관리자 등)을 담고 있다. 어드민 검증 미들웨어에서는 유저의 토큰을 decode하여 일반 유저인지, 관리자인지 검증하게 되는데 현재는 관리자라면 role에 'admin'이란 값이 들어있다.

 

function adminRequired(req, res, next) {
  // request 헤더로부터 authorization bearer 토큰을 받음.
  const userToken = req.headers.authorization?.split(' ')[1];

  ...

  // 해당 token 이 정상적인 token인지 확인
  try {
    const secretKey = process.env.JWT_SECRET_KEY || 'secret-key';
    const jwtDecoded = jwt.verify(userToken, secretKey);

    const { role } = jwtDecoded;

    if (role !== 'admin') {
      res.status(403).json({
        result: 'forbidden-approach',
        reason: '관리자만 사용할 수 있는 서비스입니다.',
      });
      return;
    }
	...
  } catch (error) {
    ...
    });
  }
}

export { adminRequired };


코치님께서는 role이라는 객체 안에 해당하는 값이 단순히 string으로 'admin' 이렇게 해서 들어가는 것은 보안적으로 좋지 않다고 하셨다. 그 이유는 토큰을 탈취당했을 때 해커 입장에서 이 사람이 어드민 권한을 가졌는지 알기 쉽게 때문이다.

 

여기서 의문점이 들었다.

 

1. 토큰을 탈취당한 시점에서 해당 토큰에는 어드민 권한이 있는건데 이미 문제가 될 수 있는 것 아닌가?
2. decode는 .env 파일에 secretKey를 통해서만 할 수 있는데 탈취할 수 있는 방법이 있는건지(상황을 가정한다면 그럴 수 있겠지만), 만약 토큰만 탈취 당한거면 decode 할 수 없는 것 아닌가? 그래서 decode를 하지 못한다면 role에 단순히 string으로 'admin'을 넣는게 문제가 되는걸까? 

 

그래서 팀원분들한테도 물어본 결과..

라는 답변을 들었다!!

https://namu.wiki/w/%EB%B8%8C%EB%A3%A8%ED%8A%B8%20%ED%8F%AC%EC%8A%A4

 

브루트 포스 - 나무위키

다른 사람에게 브루트 포스로 암호가 털리는 것을 원치 않는다면, 다음 사항을 지키자. 암호는 최소 10자리 이상을 사용하자. 암호가 12자리를 넘어간다면 슈퍼컴퓨터를 가져와도 안전하다. 숫자

namu.wiki

그리고 브루트포스 알고리즘을 활용하면 다 풀 수 있는데 100년, 200년이 걸린다고 한다..! 

 

+++ 내용 추가

- 보안을 강화하기 위한 refresh token 구현

- 로컬, 세션 스토리지 및 쿠키의 차이

 

다음 글들을 추가로 작성했습니다 !