Sparta/What I Learned

23.2.10

코딩하는 또롱이 2023. 2. 13. 20:00

🎯 REFRESH TOKEN 

🚨 블로그 참조하여 정리

 

JWT Token

: 암호화된 3가지 데이터를 이어붙인 JSON 형태의 데이터

 

1. 헤더 (header) : 알고리즘 type(3번 서명 값을 만드는데 사용될 알고리즘이 지정됨 ex) HS256)이 들어감 (언제나 JWT)

2. 페이로드 (payload) : 토큰에 담긴 주체(Subject), 만료일(exp), 생성자(iss) 등이 담겨있

3. 서명 (signature) : 헤더에 정의된 알고리즘을 통해 헤더와 페이로드 데이터를 암호화한 비밀 값. 서버만 알고 있음

 

이때 비대칭키 암호화 방식을 사용하기 때문에 서버 측에서는 이 토큰을 받아서 서명 복호화하여 디코딩하는 방식으로 토큰의 유효성을 검증할 수 있다.

 

Access Token, Refresh Token

문제는 이 JWT Token을 가지고있는 클라이언트가 정말 본인이 맞는지 확인할 수 없다.

그래서 보안 대책으로 Refresh Token 이라는 추가적인 토큰을 활용한다.

Refresh 토큰은 사용자 인증이 아닌 새로운 Access 토큰을 생성하는 용도로만 사용한다.

그렇다면 왜? 별도의 토큰을 두고 새로운 Access 토큰을 발급받을까?

이유는 JWT 유출 문제를 아래와 같이 해결하기 위함이다.

 

  • Access Token의 유효 기간을 짧게 설정하여 주기적으로 재발급하도록 설정한다.
  • Refresh Token의 유효 기간은 길게 설정한다.
  • 사용자는 Access Token과 Refresh Token을 둘 다 서버에 전송하여 Access로 인증하고 만료됐을 시 Refresh로 새로운 Access Token을 발급받는다.
  • 공격자는 Access Token을 탈취하더라도 짧은 유효 기간이 지나면 사용할 수 없다.
  • 정상적인 클라이언트는 유효 기간이 지나더라도 Refresh Token을 사용하여 새로운 Access Token을 생성, 사용할 수 있음.

하지만 만약 Refresh 토큰이 탈취당한다면 어떻게 될까?

공격자는 다시 Access 토큰을 생성해 정상적인 사용자인 척 위장할수있다.

이러한 공격을 방어하기 위해 아래와 같은 서버 측의 검증 로직이 있다.

  • DB에 각 사용자에 1대1로 맵핑되는 Access 토큰, Refresh 토큰 쌍을 저장한다.
  • 정상적인 사용자는 기존의 Access 토큰으로 접근하며 서버에서는 DB에 저장된 Access 토큰과 비교하여 검증
  • 공격자는 탈취한 Refresh 토큰으로 새로운 Access 토큰을 생성한다. 그리고 서버에 전송했을때 서버는 DB에 저장된 Access 토큰과 비교하고 두 토큰이 서로 다르다는 것을 확인한다.
  • 만약 데이터베이스에 저장된 토큰이 아직 만료되지 않은 경우 Refresh 토큰을 삭제한다.
  • 이 경우 정상적인 사용자는 자신의 토큰도 만료됐으니 다시 로그인해야 한다. 하지만 공격자의 토큰 역시 만료됐기 때문에 공격자는 정상적인 사용자의 리소스에 접근할 수 없다.

중요한 것은 발급된 토큰 자체는 그냥 그 JWT 문자열 자체로 존재하는 것이기 때문에 클라이언트나 서버측에서 전역적으로 만료시킬 수 있는 개체가 아니다. 그렇기 때문에 토큰의 유효 기간이 지나기 전까지는 만료된 토큰을 NoSQL 같은 데이터베이스에 저장하여 관리할 필요가 있다.

 

또 Refresh 토큰도 Access 토큰과 유효기간을 거의 동일하게 가지도록하여 사용자가 한번 Refresh 토큰으로 Access 토큰을 발급 받았다면 새로운 Refresh 토큰으로 다시 발급 받도록 하는 것을 권장한다고 한다.

 

 

https://blog.naver.com/gmlwo308/222212598887

https://blog.naver.com/gmlwo308/222212598887

https://hudi.blog/refresh-token-in-spring-boot-with-redis/

https://velog.io/@jkijki12/Jwt-Refresh-Token-%EC%A0%81%EC%9A%A9%EA%B8%B0

https://velog.io/@dyparkkk/spring-sequrity-jwt-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0access-token-refresh-token

https://aejeong.com/entry/Spring-boot-JWT-RefreshToken-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT

https://goodteacher.tistory.com/509

https://jangjjolkit.tistory.com/m/26

https://hungseong.tistory.com/67

https://jojoldu.tistory.com/418

 

 

https://ppaksang.tistory.com/16

 

 

 

도커 쓰는 이유 : 

서버를 고정?하려고

 

 

 

 

[Git] Can't update: no tracked branch

 

내가 새로운 브랜치를 만들면서 원격이랑 로컬에서 추적이 제대로 안 이루어져서 생긴 현상.

git branch --set --upstream-to=로컬이름/메인브랜치 추적할브랜치

이렇게 설정해주면 된다.

 

그러고 pull 해준 다음 수정사항 add, commit, push  해주고 모든 브랜치 -D로 삭제!

'Sparta > What I Learned' 카테고리의 다른 글

23.2.13  (0) 2023.02.14
23.2.12  (0) 2023.02.13
23.2.9  (0) 2023.02.09
23.2.8  (0) 2023.02.08
23.2.7  (0) 2023.02.07