쿠키 세션에 이어 또 다른 인증방식인 토큰은 최근 앱 애플리케이션에서 많이 사용되는 인증 방식 중 하나다.
우리는 이전에 세션을 통해 사용자 정보를 서버에 저장했지만, 서버 확장이 어렵고, 가용 가능한 서버의 용량이 줄어든다는 문제점을 알게 되었다. 이를 해소하기 위해서 토큰이 등장했다.
http를 배웠다면 무상태성이 서버 확장에 유리 하다는 것을 알고 있을 것이다. 토큰 인증 방식은 다음과 같은 특징을 통해 서버의 무상태성을 확보한다.
토근 인증 방식은 기본적으로 쿠키 방식와 비슷하다.
다만 차이점이 있다면, 토큰은 데이터를 암호화 하고, 서버는 토큰의 유효성을 검사 한다는 것이다.
이렇게 서버가 인증을 위해 지녀야 할 정보가 없기 때문에 서버의 부담이 줄어든다.
위의 설명들을 통해 다음과 같은 장점이 있음을 알 수 있다.
토큰 방식을 사용할 때 사용할 수 있는 것 중 하나로 JWT(JSON Web Token)가 있다.
JWT는 데이터를 JSON 객체에 담고 토큰으로 만드는게 특징이다.
JWT는 .
을 기준으로 header
, payload
, signature
로 구성된다.
header
: 설정 값이 위치//인코딩 전
{
"alg":"HS256",
"typ":"JWT"
}
payload
: 전달하려는 정보가 위치//인코딩 전
{
"sub": "someInformation",
"name": "john",
"iat": 127622301
}
signature
: 비밀키와 header의 알고리즘을 통해 토큰을 해싱한다.//인코딩 전
HMACSHA256(base64incoding(header)+'.'+base64incoding(payload), secret)
여기서 말하는 해싱이란 간단하게 말해서 해시 함수를 통해 기존 문자열을 더 짧은 길이의 값으로 변환하는 것을 의미한다.
물론 만능은 아니기에 취약한 부분도 존재하나 자세한 설명은 다른 포스트에서 다루도록 하겠다.
다시 토큰으로 돌아와서,
토큰은 입장권과 비슷한 역할을 하기에 누군가 특정 사용자의 토큰을 탈취해 요청을 보낼경우, 서버는 토큰이 유효한지만 확인하고, 요청에 해당하는 응답을 보낸다.
이런 특성 때문에 서버는 토큰이 탈취 당해도 토큰을 만료시키는 등의 조치를 취할 수 없고, 유효기간이 만료되기를 기다려야 한다.
이를 보안하기 위해서 Access Token과 Refresh Token이 등장했지만, 모든 문제를 해결해 주진 못했다. 그래도 등장 했으니 간략히 설명하자면
그렇다 Refresh Token이 탈취되면 말짱 도루묵이다.
물론 재발급 횟수를 1회로 하거나, Refresh Token을 서버에 저장하는 등의 방법이 있지만,
결국 탈취 안당하는 것이 제일 좋기 때문에, 최선의 방법은 아니다.
보는 사람이 있을까 싶지만 JWT의 취약점(결국은 토큰의 취약성과 마찬가지라 다)이 궁금하다면에 코딩애플의 영상도 한번쯤 봤으면 한다. JWT의 취약점에 대한 부분을 쉽고 재미있게 알려주고, 댓글창에 여러 의견이 있는데 나의 경우는 새롭게 알아가는 내용들이 있었다.(물론 읽어도 잘 모르기에 공부해볼 목록에 추가만 했다)