Bearer token
배경
-
토큰이 처음나왔을 때 무수히 많은 scheme들이 존재했다.
- Authorization: type, credentials
- 개발자가 마음대로 정하는 이름이 곧 개발하는 서비스에서 사용하는 토큰인증방식의 scheme가 되었고 이는 후에 OAuth, OIDC같은 기술에 적용하려면 scheme가 다르기때문에 적용하지 못했고 W3C가 표준 형태를 정하기위해 토큰기반 인증은
Bearer라는 Scheme를 사용하도록
프로토콜을 정했다.
-
Scheme 이름이 곧 개발하는 서비스에서 사용하는 토큰 기반 인증 방식의 Scheme
-
Bearer 토큰은 access key를 통해 허가를 요청한다. such as a JSON Web Token(JWT)
-
included in the request header
토큰의 암호화
- 사용자의 정보를 가진 토큰을 암호화하여 저장하기 때문에 클라이언트에서 보관할 수 있다. 따라서 XSS, CSRF 공격에서 안전하다.
JWT
종류
- Access Token, Refresh Token
- 둘다 기간을 줄수 있지만 access token은 보통 기간을 짧게 가져간다.
특징
- 유저의 실제 권한을 얻는데 사용하는 토큰은 엑세스토큰
- 엑세스토큰은 인증과 관련되어있기 때문에 짧은 유효기간을 가지고 만료가 된다.
- 유저의 정보를 매우 중요시 하는곳은 사용자의 편의보다 보안을 위해 Refresh 토큰을 따로 발급하지 않는다.
구성
- Header
어떤 종류
의 토큰인지 명시
어떤 알고리즘
으로 시그니처를 암호화할지 적힘
- base64로 인코딩 (디코딩이쉬움)
{
"alg":"HS256,
"typ": "JWT",
}
- Payload
- body부분. 서버에서 사용할 정보가 담김 ex)유저정보, 어떤 정보에 접근 가능한지
- base64로 인코딩 (디코딩이쉬움 - 중요한 정보는 안담는게 좋음)
- Signature
서버의 비밀키
와 헤더에서 지정한 알고리즘
을 사용하여 해싱한다.
- 토큰의 헤더를 알아내서 지정한 알고리즘을 알아낸다해도 서버의 비밀키까지 알지 못한다면 다른 Signature가 만들어지기 때문에 서버는 해당 토큰이 올바르지 않은 토큰임을 알 수 있다.
4-1. 헤더, 페이로드를 string -> buffer -> base64인코딩
4-2. 인코딩된 헤더와 인코딩된 페이로드, 시그니처 이 세개를 . 으로 구분해서 하나의 스트링으로 만들면 토큰이된다.
저장 위치
- Local Storage, Sesstion Storage, Cookie, state 등
전송방법
- HTTP헤더의 Authorization 헤더 또는 Cookie에 토큰을 담아 보낸다.
- Authorization 헤더를 사용하면 Bearer Authentication을 이용한다.
토큰 기반인증의 장점
- 무상태성 & 확장성
- 서버는 클라이언트의 정보를 저장할 필요가 없기 때문.
- 토큰이 해독되는지만 판단해서 권한을 준다.
- 따라서 클라이언트는 요청을 보낼때마다 토큰을 헤더에 포함시켜 보낸다.
- 만약 한개의 클라이언트가 여러개의 서버와 통신을 해야되는 상황이면 같은 토큰으로 여러 서버에서 인증하여 통신이 가능하다. 만약 토큰이 없었다면 각 서버에 회원의 정보를 모두 가지고 있어야 하기 때문에 겹치는 데이터가 많아진다.
- 안전하다.
- 서버는 토큰을 생성하는 서버를 따로 사용할수 있다.
- 그만큼 서버의 특성에맞게 운용이가능하고 서버에 가해지는 부하가 줄어든다.
- 권한부여에 용이하다.
- payload에 어떤 정보에 접근가능한지 지정할수 있기 때문에 권한부여에 용이하다.
토큰 인증 흐름도
- 11의 만료신호는 약속된신호를 보냄 보통 401 상태를 보냄
- 새로운 AccessToken을 발급후 다시 재요청
재요청 흐름도
참고
bearer 란?
https://www.ssemi.net/what-is-the-bearer-authentication/