🎯 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://aejeong.com/entry/Spring-boot-JWT-RefreshToken-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
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로 삭제!