Token
Aug 3, 2021
»
Token
클라이언트에서 인증 정보를 보관하는 방법으로 고안된게 토큰 기반 인증입니다
토큰기반 인증 중 대표적인 JWT의 종류
- Access Token
보호된 정보들(유저의 이메일, 사진 등)에 접근할 수 있는
권한부여
에 사용합니다 - Refresh Token Access Token의 유효기간이 만료된다면 Refresh Token을 통해 재발급받습니다
JWT 구조
![Token%202628a6c70936429d8312b5ee4fab06db/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2021-08-03%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_10.07.17.png](Token%202628a6c70936429d8312b5ee4fab06db/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2021-08-03%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_10.07.17.png)
-
Header 어떤 종류의 토큰인지, 어떤 알고리즘으로 암호화 할지가 적혀있습니다
{ "alg": "HS256", "typ": "JWT" }
-
Payload 정보가 담겨 있습니다. 어떤 정보에 접근 가능한지에 대한 권한을 담을 수도 있으며 사용자의 유저 이름 등 필요한 데이터는 이곳에 담아 암호화 시킵니다
{ "sub": "someInformation", "name": "phillip", "iat": 151623391 }
-
Signature 원하는 비밀키를 사용하여 암호화합니다
HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);
JWT 사용법
토큰기반 인증 절차
- 클라이언트가 서버에 아이디/비밀번호를 담아 로그인 요청을 보낸다.
- 아이디/비밀번호가 일치하는지 확인하고, 클라이언트에게 보낼 암호화된 토큰을 생성한다.
- access/refresh 토큰을 모두 생성한다.
- 토큰에 담길 정보(payload)는 유저를 식별할 정보, 권한이 부여된 카테고리(사진, 연락처, 기타등등)이 될 수 있다.
- 두 종류의 토큰이
같은 정보를 담을 필요
는 없다 (이 스프린트에서는 같은 정보를 담아줍시다).
- access/refresh 토큰을 모두 생성한다.
- 토큰을 클라이언트에게 보내주면, 클라이언트는 토큰을 저장한다.
- 저장하는 위치는 local storage, cookie, react의 state 등 다양하다.
- 클라이언트가 HTTP 헤더(authorization 헤더)에 토큰을 담아 보낸다.
- 서버는 토큰을 해독하여
"아 우리가 발급해준 토큰이 맞네!"
라는 판단이 될 경우, 클라이언트의 요청을 처리한 후 응답을 보내준다.
토큰기반 인증의 장점
- Statelessness & Scalability (무상태성 & 확장성)
- 서버는 클라이언트에 대한 정보를 저장할 필요 없습니다 (토큰 해독이 되는지만 판단합니다)
- 클라이언트는 새로운 요청을 보낼때마다 토큰을 헤더에 포함시키면 됩니다
- 서버를 여러개 가지고 있는 서비스라면 더더욱 빛을 발휘합니다 (같은 토큰으로 여러 서버에서 인증 가능)
- 안전하다
암호화
한 토큰을 사용하고, 암호화 키를 노출 할 필요가 없기 때문에 안전합니다
- 어디서나 생성 가능하다
- 토큰을 확인하는 서버가 토큰을 만들어야 하는 법이 없습니다
- 토큰 생성용 서버를 만들거나, 다른 회사에서 토큰관련 작업을 맡기는 것 등 다양한 활용이 가능합니다
- 권한 부여에 용이하다
- 토큰의 payload(내용물) 안에 어떤 정보에 접근 가능한지 정할 수 있습니다
- ex) 서비스의 사진과 연락처 사용권한만 부여
- 토큰의 payload(내용물) 안에 어떤 정보에 접근 가능한지 정할 수 있습니다