토근 인증 방법 with JWT

DY·2022년 11월 14일
0

CS

목록 보기
9/10

Bearer token

배경

  • 토큰이 처음나왔을 때 무수히 많은 scheme들이 존재했다.

    • Authorization: type, credentials
      • 여기에서 type이 scheme를 말함
    • 개발자가 마음대로 정하는 이름이 곧 개발하는 서비스에서 사용하는 토큰인증방식의 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 토큰을 따로 발급하지 않는다.

구성

  1. Header
    • 어떤 종류의 토큰인지 명시
    • 어떤 알고리즘으로 시그니처를 암호화할지 적힘
    • base64로 인코딩 (디코딩이쉬움)
{
	"alg":"HS256,
    "typ": "JWT",
}
  • JSON형태로 위의 정보가 담김
  1. Payload
    • body부분. 서버에서 사용할 정보가 담김 ex)유저정보, 어떤 정보에 접근 가능한지
    • base64로 인코딩 (디코딩이쉬움 - 중요한 정보는 안담는게 좋음)
  2. Signature
    • 서버의 비밀키헤더에서 지정한 알고리즘을 사용하여 해싱한다.
    • 토큰의 헤더를 알아내서 지정한 알고리즘을 알아낸다해도 서버의 비밀키까지 알지 못한다면 다른 Signature가 만들어지기 때문에 서버는 해당 토큰이 올바르지 않은 토큰임을 알 수 있다.

4-1. 헤더, 페이로드를 string -> buffer -> base64인코딩
4-2. 인코딩된 헤더와 인코딩된 페이로드, 시그니처 이 세개를 . 으로 구분해서 하나의 스트링으로 만들면 토큰이된다.

저장 위치

  • Local Storage, Sesstion Storage, Cookie, state 등

전송방법

  • HTTP헤더의 Authorization 헤더 또는 Cookie에 토큰을 담아 보낸다.
  • Authorization 헤더를 사용하면 Bearer Authentication을 이용한다.

토큰 기반인증의 장점

  1. 무상태성 & 확장성
  • 서버는 클라이언트의 정보를 저장할 필요가 없기 때문.
    • 토큰이 해독되는지만 판단해서 권한을 준다.
    • 따라서 클라이언트는 요청을 보낼때마다 토큰을 헤더에 포함시켜 보낸다.
    • 만약 한개의 클라이언트가 여러개의 서버와 통신을 해야되는 상황이면 같은 토큰으로 여러 서버에서 인증하여 통신이 가능하다. 만약 토큰이 없었다면 각 서버에 회원의 정보를 모두 가지고 있어야 하기 때문에 겹치는 데이터가 많아진다.
  1. 안전하다.
  2. 서버는 토큰을 생성하는 서버를 따로 사용할수 있다.
    • 그만큼 서버의 특성에맞게 운용이가능하고 서버에 가해지는 부하가 줄어든다.
  3. 권한부여에 용이하다.
    • payload에 어떤 정보에 접근가능한지 지정할수 있기 때문에 권한부여에 용이하다.

토큰 인증 흐름도

  • 11의 만료신호는 약속된신호를 보냄 보통 401 상태를 보냄
  • 새로운 AccessToken을 발급후 다시 재요청

재요청 흐름도

참고

bearer 란?

https://www.ssemi.net/what-is-the-bearer-authentication/

profile
화면에 보이는 모든것에 관심이 있습니다. 개발하면서 고민했던것들, 공부했던걸 기록하는 저장소입니다.

0개의 댓글