Spring/Spring Boot

[Spring Boot] Access Token & Refresh Token

JoonYong 2024. 2. 20. 22:48

 

1. JWT 비밀키 탈취

JWT 토큰은 우리가 서버와 클라이언트 간에 안전하게 정보를 주고받을 수 있게 해주는 열쇠와 같습니다. 이 열쇠는 사용자의 신원이나 권한 같은 중요한 정보를 담고 있습니다. 그래서 이 열쇠를 사용하면, 클라이언트와 서버는 서로를 신뢰하고 통신할 수 있습니다.

 

JWT 토큰 인증방식은 비밀키(개인키 or 대칭키)를 사용하여 암호화합니다.

누군가 이 비밀키를 가지고 있다면 그 사람은 신뢰할 수 있는 사람으로 인정받습니다.

 

비밀키를 탈취당하게 된다면 문제가 발생하기 때문에 비밀키에 유효 기간을 두어야합니다

그런데 유효기간을 짧게 두면 사용자가 로그인을 자주 해야하므로 사용자 경험적으로 좋지 않고, 유효기간을 길게 두면 보안상 탈취 위험에서 벗어날 수 없습니다.

 

이런 문제를 해결하기 위해, 우리는 두 개의 열쇠를 사용합니다.

하나는 짧은 유효기간을 가진 열쇠(Access Token)이고, 다른 하나는 긴 유효기간을 가진 열쇠(Refresh Token)입니다. 이 두 개의 열쇠를 적절히 사용함으로써, 사용자는 편리하게 서비스를 이용하면서도 안전을 유지할 수 있습니다.

이렇게 두 개의 열쇠를 사용하는 방식이 바로 JWT 토큰 인증방식입니다.

 

Access Token과 Refresh Token에 대하여 정리한 내용입니다.

 

[Spring Boot] JWT(Json Web Token) - 웹의 안전한 인증 방식

JWT에 대하여 설명하기 이전에 Session / Cookie 방식과 Token 방식에 대하여 먼저 설명하겠습니다. 1. Session / Cookie 방식 vs Token 방식 사용자 인증 방식에는 크게 Session / Cookie 방식과 Token 방식이 있습니

achieve-dev.tistory.com


2. Access Token이란?

Access Token은 클라이언트가 서버에게 사용자의 인증 정보를 제공한 후, 서버가 클라이언트에게 제공하는 토큰입니다. 이 토큰은 사용자의 인증 정보를 갖고 있으며, 보통 HTTP 헤더에 포함시켜 서버에 요청을 보낼 때 사용됩니다. Access Token은 일정 시간이 지나면 만료되며, 이후에는 사용할 수 없습니다.

 

2-1) 구조

  • 헤더: 토큰 형식 및 알고리즘 정보 포함
  • 페이로드:
    • 사용자 식별 정보 (예: 사용자 ID, 이름, 역할)
    • 만료 기간 (짧음, 예: 1시간)
    • 발급 시간
    • 추가 정보 (선택 사항)
  • 서명: 토큰 변조 위조 방지

3. Refresh Token이란?

Refresh Token은 Access Token과 같이 사용되며, Access Token이 만료되었을 때 새로운 Access Token을 발급받는 데 사용됩니다. Refresh Token은 일반적으로 Access Token보다 훨씬 긴 유효 기간을 가지고 있습니다.

 

3-1) 구조

  • 헤더: 토큰 형식 및 알고리즘 정보 포함
  • 페이로드:
    • 사용자 식별 정보 (예: 사용자 ID)
    • 만료 기간 (길음, 예: 1개월 or 12개월)
    • 발급 시간
    • 추가 정보 (선택 사항)
  • 서명: 토큰 변조 위조 방지

4. 인증 과정

 

1. 사용자가 ID , PW를 통해 로그인.

2. 서버에서는 회원 DB에서 값을 비교

3~4. 로그인이 완료되면 Access Token, Refresh Token을 발급한다. 이때 회원DB에도 Refresh Token을 저장해둔다.

5. 사용자는 Refresh Token은 안전한 저장소에 저장 후, Access Token을 헤더에 실어 요청을 보낸다.

6~7. Access Token을 검증하여 이에 맞는 데이터를 보낸다.

8. 시간이 지나 Access Token이 만료됐다.

9. 사용자는 이전과 동일하게 Access Token을 헤더에 실어 요청을 보낸다.

10~11. 서버는 Access Token이 만료됨을 확인하고 권한없음을 신호로 보낸다.

12. 사용자는 Refresh Token과 Access Token을 함께 서버로 보낸다.

13. 서버는 받은 Access Token이 조작되지 않았는지 확인한후, Refresh Token과 사용자의 DB에 저장되어 있던 Refresh Token을 비교한다. Token이 동일하고 유효기간도 지나지 않았다면 새로운 Access Token을 발급해준다.

14. 서버는 새로운 Access Token을 헤더에 실어 다시 API 요청 응답을 진행한다. 

 


5. 왜 두 가지 토큰을 사용할까?

Access Token은 짧은 유효 기간을 가지므로, 만약 토큰이 노출되어 보안 문제가 발생하더라도 피해를 최소화할 수 있습니다. 그러나 매번 사용자가 로그인하여 새로운 Access Token을 발급받는 것은 사용자 경험에 좋지 않습니다. 이 문제를 해결하기 위해 Refresh Token이 도입되었습니다. Refresh Token을 사용하면 사용자는 로그인 없이 새로운 Access Token을 발급받을 수 있습니다.

 


6. 결론

구분 JWT 토큰 Access 토큰 Refresh 토큰
용도 사용자 인증 및 권한 부여 API 요청
Access 토큰 갱신
만료 기간 짧음 (보안 강화) 짧음 길음
구성 헤더, 페이로드, 서명 헤더, 페이로드, 서명
헤더, 페이로드, 서명
페이로드 사용자 식별 정보, 만료 기간 등 사용자 식별 정보, 만료 기간 등
사용자 식별 정보, 만료 기간 등
보안 암호화, HTTPS 사용 권장 암호화, HTTPS 사용 권장
암호화, HTTPS 사용 권장

 

 

 

 

 

[Reference]

https://velog.io/@chuu1019/Access-Token%EA%B3%BC-Refresh-Token%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C

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