Golang에서 JWT사용하기
in BackEnd
JWT
JWT는 웹표준으로서 C, Java, Python, JS등 대부분의 주류 프로그래밍 언어에서 지원됩니다. 또한 필요한 모든 정보를 자체적으로 가지고 있어 자가 수용적(Self-contained)이며 그렇기에 두 개체 사이에서 쉽게 전달될 수 있는 장점들을 가지고 있습니다.
JWT는 .
으로 구분되는 Header, Payload, Signature의 3가지 문자열로 되어있습니다.
Header
Header는 토큰의 타입과 해싱 알고리즘이라는 두가지 정보를 담고 있습니다
{"alg":"HS256","typ":"JWT"}
보통 해싱 알고리즘은 HS256
을 사용하지만 HS512
을 이용해 토큰을 더 길게 만들수 있습니다.
Payload
Payload에는 토큰에 담을 정보가 들어가며, 담는 정보의 한 조각은 name/value의 한 쌍으로 이루어진 Claim이라고 부릅니다. Claim은 Registered, Public, Private의 세 분류로 나뉘어져 있으며 Registered Claim은 토큰 발급자, 토큰 제목, 토큰 만료시간, 토큰 발급시간 등 토큰에 대한 정보를 담기 위해 이미 이름이 정해진 Claim 입니다.
- Registered Claim
iss
: 토큰 발급자 (issuer)sub
: 토큰 제목 (subject)aud
: 토큰 대상자 (audience)exp
: 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며 (예: 1480849147370) 언제나 현재 시간보다 이후로 설정되어있어야합니다.nbf
: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.iat
: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의age
가 얼마나 되었는지 판단 할 수 있습니다.jti
: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.
Signature
JWT의 마지막 부분은 서명으로, Header의 인코딩값과 Payload의 인코딩값을 합친 후 주어진 비밀키로 해싱하여 생성합니다
https://jwt.io/ 에서 토큰의 정보를 확인할 수 있습니다. 그런데, 이렇게 외부에서 토큰의 정보를 바로 확인할 수 있기 때문에 보안이 좋다고 할 수는 없습니다.
그러므로 유효기간이 짧은 토큰을 만들면 되는것 아니냐? 라고 물어볼 수 있겠지만
유효기간이 짧은 토큰의 경우 그만큼 사용자는 로그인을 자주 해서 새롭게 토큰을 발급 받아야 하므로 불편합니다.
그렇다고 유효기간을 늘리면 토큰을 해킹당했을 때 보안에 더 취약해지게 됩니다.
이러한 점들을 보완하는 것이 Refresh Token
입니다.
- refresh token은 access token과 같은 형태의 JWT입니다. refresh token은 처음에 로그인을 완료 했을 때 access token과 동시에 발급됩니다. access token보다 긴 유효기간을 가지면서 access token이 만료되었을 때 새로 발급해 주는 열쇠가 됩니다.
- access token이 해킹 당하면 정보가 유출됩니다. 하지만 유효기간을 짧게 해두면(30분 ~ 2시간) 그 기간 안에서만 사용이 가능하기 때문에 더 안전하다는 의미가 됩니다.
- refresh token의 유효기간이 만료되면, 사용자는 새로 로그인 해야 합니다. refresh token도 해킹될 가능성이 있기 때문에 적절한 유효기간(2주 ~ 2달) 설정이 필요합니다.
토큰 타입
로그인 요청을 하고 나서, 서버에서 토큰을 프론트에게 넘겨줄 때, 토큰을 하나 더 만들어서 넘겨줍니다. 하나 더 만든 토큰을 refresh token
이라고 하고 기존에 발행하던 토큰을 access token
이라고 합니다.
엑세스토큰은 인증이 필요한 요청에 액세스 토큰을 사용합니다. 그리고 15분 정도로 짧을 것을 권장합니다. 엑세스 토큰 유효시간이 짧으면 해커가 작업할 시간이 충분하지 않기 떄문입니다.
대신 리프레시 토큰은 access token
이 만료되었을 때, access token
을 다시 발행하기 위한 용도로 쓸것이기 때문에 access token
보다 유효기간이 길어야 합니다. 엑세스 토큰이 만료되는 경우 리프레시 토큰을 보내서 새로운 액세스 및 리프레시 토큰을 생성합니다.
참조 : https://covenant.tistory.com/203
https://velopert.com/2389