JWT 토큰에 관한 용어
- 액세스 토큰(Access Token) : 사용자나 컴퓨터 프로그램이 접근할 권리를 증명하는데 사용되는 문자열이며 , 일반적으로 인터넷 웹에서 사용자 인증 및 권한 부여를 위해 주로 사용된다.
예를 들어보자면 , 소셜미디어 플랫폼이나 웹사이트에서 사용자가 로그인을 할 때 서버에서 사용자의 인증 정보를 확인한 후 엑세스 토큰을 발급해준다. 그리고 사용자가 이후 서비스를 이용할 때마마 이 토큰을 사용하여 자신의 인증상태를 증명하게 된다.
- 리프레쉬 토큰(Refresh Token) : 엑세스 토큰만을 사용하게 되면 짧은 유효기간 때문에 사용자는 로그인을 자주 해야돼서 자꾸 새롭게 토큰을 발급받아야 하는 단점이 있다. 그렇다고 유효기간을 길게 해버리면 토큰을 탈취당했을 때 큰 보안문제가 생길 수 있기 때문에 보안성에 문제가 생긴다.
이 때 토큰을 재발급하는 역할만을 담당하는 토큰을 생성해서 관리하게 되는데 이것이 리프레쉬 토큰 이다.
사용자가 로그인을 할 때 DB에서 ID와 PW를 비교해서 로그인을 하게 되는데 , 이 때 로그인에 성공한다면 토큰을 발급하는데 , 이 때 엑세스토큰과 리프레쉬 토큰을 같이 발급한다. 이 때 회원 DB에도 레프레쉬 토큰을 저장해둔다.
(DB는 Redis 같은 인메모리 DB를 사용한다.)
JWT 와 엑세스 토큰의 비교
JWT 와 엑세스 토큰이 같은 거라고 생각을 했는데 약간은 다른 점이 있었다.
JWT는 엑세스 토큰을 구현하는 방식 중 하나라고 한다.
구분 | JWT (JSON Web Token) | 액세스 토큰 (Access Token) |
정의 | JSON 객체를 사용하여 정보를 안전하게 전송하기 위한 컴팩트하고 독립적인 방식입니다. | 사용자가 인증을 완료한 후 자원에 접근할 수 있는 권한을 부여받는 데 사용되는 크리덴셜(증명 정보)입니다. |
사용 목적 | 인증 및 정보 교환에 주로 사용됩니다. 정보가 디지털 서명되어 있어 정보의 무결성을 보장합니다. | 사용자가 시스템이나 네트워크 리소스에 접근할 수 있는 권한을 증명하는 데 사용됩니다. |
형태 | JWT는 특정 형식(JSON)을 가지며, 세 부분(헤더, 페이로드, 시그니처)으로 구성됩니다. | 형태가 정해져 있지 않으며, 문자열, JWT, 다른 형식의 토큰 등 다양한 방식으로 구현될 수 있습니다. |
내용 | 발급자, 만료 시간, 주제 등 사용자와 관련된 정보를 포함할 수 있습니다. | 일반적으로 사용자의 식별 정보나 권한 범위 등 인증 후 접근 권한에 대한 정보를 포함하지만, 구체적 내용은 구현에 따라 다릅니다. |
사용 예시 | OAuth에서 액세스 토큰으로 사용될 수 있으며, 또한 정보 교환의 수단으로도 사용될 수 있습니다. | 웹 애플리케이션, API 접근 권한 부여, 소셜 미디어 로그인 등 다양한 인증 시스템에서 사용됩니다. |
보안 | 정보가 디지털 서명되어 있어, 정보의 무결성 및 변조 방지를 제공합니다. 암호화를 통해 정보를 보호할 수도 있습니다. | 보안 수준은 구현 방식에 따라 다르며, JWT나 다른 안전한 방식으로 구현될 수 있습니다. |
간단히 생각해보자면 , 엑세스 토큰은 사용자가 인증에 성공하고 나서 특정 자원에 접근할 수 있는 권한을 부여받는데 사용되는 증명정보(크리덴셜,credential) 이다.
그러면 스케줄드에서 토큰을 만료시키는게 시간이 아니라 특정 조건에서 초기화를 시키게 할 수도 있나 ?
그냥 창을 닫았을 때 라던가 그런 조건에서 …
알아보니 그건 안된다고 한다. JWT 가 기본적으로 Stateless 한 방식이고 만료 시간의 기본 동작원리 때문에 직접적으로 구현하기 힘들다고 함.
리프레쉬 토큰을 만료하는 방법
- 로컬 스토리지 사용방법
- 자바스크립트를 사용해 키 - 값 형태로 데이터를 저장한다.
- 브라우저를 종료해도 데이터가 유지된다.
- XSS 공격에 취약하다.
- 쿠키를 사용한 토큰 만료 방법
- 브라우저와 서버 간 데이터를 교환하기 위해 사용하한다.
- 요청 시 자동으로 쿠키 데이터를 키 - 값 형태로 서버로 전송한다.
- 쿠키에 HttpOnly 속성을 설정하면 자바스크립트로 접근이 불가능하다(XSS방지)
보통은 쿠키를 사용하는 방법을 더 권장한다고 한다. (보안 옵션을 활용하면 민감한 데이터를 안전하게 저장할 수 있기 때문이라고 함 !)
보안상 문제 때문에 최소한의 만료 기간이 필요함.
서버에서 이 리프레쉬 토큰값을 보관하면 길게유지해도 되는데
같이 전달하면 뭐 짧게 유지하는게 좋다고함 .
XSS 공격( Cross -Site Scripting )이란?
액세스 토큰을 넣고 빼고 하는작업은 비즈니스 로직 선에서 처리하는거라고 한다.
그래야 트랜잭션 처리를 할 수 있기 때문이다.
근데 , 토큰을 발급하는것 까지는 뭐 알겠다고 치겠는데 , 대체 이 토큰이 어디에 사용되고 왜 사용되는지 이해가 잘 되지 않았다. 예를 들어 특정 사이트에 로그인을 하면 그냥 계속 로그인 상태가 유지되는게 당연한것 아닌가 ? 라고 생각을 했기 때문이다. 그래서 이 토큰이라는게 왜 필요하고 어떨 때 사용되는 것인지 알아보았다.
알아보니 HTML 은 Stateless 프로토콜이기 때문에 브라우저가 페이지를 이동하거나 새로고침하게 되면 , 서버는 사용자가 누구인지를 알지 못하는 상태가 된다고 한다. 그래서 서버는 이런 매 요청마다 사용자를 식별할 수 있는 인증정보를 확인해야 하게 되는데 이때 엑세스 토큰이 사용된다고 한다.
결론적으로는 “로그인 상태를 유지” 하는데에도 계속해서 인증이 필요하고 이 때 엑세스 토큰과 리프레시 토큰이 사용되는 것이다 !
'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글
24년 12월 9일 (1) | 2024.12.18 |
---|---|
24년 12월 6일 (2) | 2024.12.15 |
24년 12월 4일 (0) | 2024.12.15 |
24년 12월 3일 (0) | 2024.12.15 |
24년 12월 2일 (2) | 2024.12.10 |