[네트워크] JWT란?
0. 들어가기 전에
JWT를 개념을 처음 접하게 되어서 정리해보았습니다.
1. JWT란?
Json 포맷을 이용하여 사용자의 정보를 저장하는 토큰
JWT는 Json Web Token의 약자로, 토큰 자체에 정보를 Json 포맷 형식으로 저장하여 사용한다.
1.1 JWT 구조
[ 헤더 ]
- JWT에서 사용할 타입(typ)과 해시 알고리즘의 종류(alg)가 담겨 있음
[ 페이로드 ]
- 토큰에서 사용할 정보를 담고 있음
- 이러한 정보들의 조각을 claim이라고 함.
- 서버에서 첨부한 사용자 권한 정보의 데이터
- 토큰에 대한 데이터
[ 서명 ]
- (헤더를 Base64로 인코딩한 값 + "." + 페이로드를 Base64로 인코딩한 값)를 서버의 비밀키를 이용해서 헤더에 명시된 알고리즘으로 암호화된 값
- 서버의 비밀키는 노출이 되지 않았으므로 다른 클라이언트들이 임의로 복호화를 할 수 없다.
1.2 장단점
[ 장점 ]
- 토큰 자체가 인증된 정보이기 때문에, 세션처럼 서버에서 인증 정보를 필수적으로 관리할 필요가 없다.
- 서버가 무상태(stateless)가 되기 때문에 서버 확장에 유리하다.
- 서버가 비밀키를 관리하기 때문에 안전한다.
[ 단점 ]
- Base64로 인코딩이 되어있으므로 토큰의 길이가 길다. -> 네트워크 부하가 심해질 수 있다.
- 페이로드는 Base64로 디코딩 할 수 있으므로, 페이로드에 중요한 정보가 있을 때, 탈취되면 악용되기 쉽다.
- 페이로드에는 식별하기 위한 정보만을 담아둬야 한다.
- 로그아웃을 구현하기가 어렵다. -> blacklist라는 DB 테이블에 넣어서 접근을 막아야 한다.
2. 인증 방식
여기서 static 변수에 JWT를 저장하는 이유는 매 요청시 Local Storage에 접근에 JWT를 찾게 되면 오버헤드가 많이 생길 수 있기 때문이다.
클라이언트는 JWT를 가지고 있으면 요청 시에 Authorization의 Bearer로 JWT 토큰을 보내게 되고, 서버는 헤더를 조사해 JWT를 찾아 검증한다.
{
"Authorization": "Bearer 'JWT'"
}
3. Sliding Sessions과 Refresh Token
JWT도 용빼는 재주가 있는 것이기 때문에 탈취될 위험이 있다. 이 때문에 Access Token의 만료 시간을 30분 정도로 짧게 가져간다. 하지만 이럴 경우 사용자가 한 페이지에 오랫동안 머물면 로그인이 풀리게 돼 다시 로그인한 상황이 발생한다.
이럴 경우에는 어떤 방식으로 단점을 해결할까?
3.1 Sliding Sessions
Sliding Sessions는 세션을 지속적으로 유지하는 유저에게 요청마다 새로운 토큰을 발급하는 식으로 토큰의 만료 기간을 늘려주는 것이다. 이 방법이 비효율적이라고 생각이 들면 결제를 시작할 때나 글쓰기 시작할 때 토큰을 발급하는 형식으로도 바꿀 수 있다. 하지만 단발성으로 이루어지는 서비스에서는 효과가 떨어진다.
3.2 Refresh Token
클라이언트에게 Access Token과 긴 만료 시간을 갖는 Refresh Token을 같이 발급하는 방법이다. Refresh Token은 클라이언트뿐만 아니라 서버에 저장해서 검증하는 용도로 사용된다. Access Token이 만료되면 서버가 토큰이 만료되었다는 정보를 클라이언트에게 알리고, 클라이언트는 Access Token과 Refresh Token을 같이 서버로 보내 서버가 Token을 검증한다. 만약 Refresh Token의 만료 기간이 남아있으면, 새로운 Access Token을 발급하고, 아니면 사용자는 다시 로그인하게 된다.
여기서 의문이 드는 부분은 왜 클라이언트가 Refresh Token만 보내면 되는데 만료된 Access Token도 같이 보내느냐?
이다. 왜냐하면 Access Token 없이 Refresh Token만으로 Token의 유효성을 따지면, Access Token이 변조되었는지(탈취되었는지) 모르기 때문이다. 이중으로 보안을 걸어서 더욱 안전히 쓰기 위해서 두 Token을 모두 검증한다.
하지만 이 방법도 서버가 따로 Refresh Token을 관리한다는 점이 있다.
※ 참고
'CS > [NETWORK]' 카테고리의 다른 글
[네트워크] 쿠키와 세션 (0) | 2022.05.04 |
---|---|
Chapter 7 HTTP 헤더2 - 캐시와 조건부 요청 (0) | 2021.11.25 |
Chapter 7 HTTP 헤더1 - 일반헤더 (0) | 2021.11.23 |
Chapter 6 HTTP 상태 코드 (0) | 2021.11.18 |
Chapter 5 HTTP 메서드 활용 (0) | 2021.11.16 |