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

wookhyung·2022년 7월 20일
1

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

오늘 오피스아워 시간에 백엔드 코치님에게 어드민 검증 미들웨어와 관련된 조언을 들었는데, 먼저 현재 프로젝트 내에서는 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'을 넣는게 문제가 되는걸까?

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

라는 답변을 들었다. 하지만.... 👇

+++ 내용 추가

  • 보안을 강화하기 위한 refresh token 구현
  • 로컬, 세션 스토리지 및 쿠키의 차이
profile
Front-end Developer

0개의 댓글