jwt 사용 시 보안 이슈

햐얀하늘·2023년 9월 26일
0

로그인했을 때 파악하는 방법

ex) 해외 축구를 보여주는 사이트가 있을 때 로그인한 사람만 보여준다고 할때 어떻게 이 사람이 로그인했는지 안했는지 파악할 수 있을까?

유저가 로그인시 시청권을 발급 해줌

유저는 축구를 볼때마다 시청권이 유효한지 파악하고 ok면 폴 수 있고 아니면 못 봄

  1. session 방식
    입장권에 들어가있는 정보가 거의 없다

    발급번호만이 들어있다.

    이 발급번호가 입장권발급목록에 있는지 파악해서 던져준다.

  2. token 방식
    회원명, 이메일, 발급일, 유호기간 등이 적혀있다.
    이 때 유효기관에 별 문제가 없으면 유저를 통과
    stateless함

    단점: 회원수가 엄청 많을 경우 입장권 발급 목록을 다 뒤져서 유효한지 안한지 파악해야함

    이때 jwt는 유호기관만 파악하면 됨

JWT 사용 시 발생 할 수 있는 문제

문제1. alg : none 공격

{
  "alg": "HS256",
  "typ": "JWT"
}

jwt 생성시 header에는 "alg", "typ"이 들어간다. 이때 alg를 "none"으로 하는 경우 문제가 발생한다 반드시 HS256를 사용해야한다.

문제2. jwt는 변환이 쉽다(decoding이 쉽다) => 개인에게 민감한 정보를 넣어선 안된다!! 다 털릴 수 있다.

문제3. 시크릿키 문제 => secret키를 대충 적으면 맞추기가 쉽다
특히 브루트포스 어택으로 다 뚫릴 수 있다.
해결책!!

  • 키를 매우길고 어렵게하고 공유하지 않는다.
  • 생성용키/검증용키 2개 사용

문제4. jwt 탈취
jwt가 탈취당하면 해당 jwt를 정지시키거나 사용하지 못하게 할 수 없다.

해결책

  • 훔치기 어렵도록
  • jwt 블랙리스트를 걸어놓음
  • jwt 유효기간 짧게 -> refresh token이 필요
  • refresh token rotation 이용 -> refresh token은 1회용
    refresh token을 재사용하거나 재발급 한다면 access token을 주지 않는 것
profile
나는 커서 개발자가 될거야!

0개의 댓글