코딩하는라민

[Supabase] JWTs(JSON Web Tokens) 공식문서 읽기 본문

Serverless/Supabase

[Supabase] JWTs(JSON Web Tokens) 공식문서 읽기

코딩하는라민 2024. 5. 17. 12:20
728x90
반응형

[Supabase] JWTs(JSON Web Tokens) 공식문서 읽기

 

 

`JSON Web Tokens` 은 string 으로 표현되는 데이터 구조의 한 종류이다.

보통 사용자에 대한 아이덴티티, 권한 정보를 포함한다.

JWT 는 라이프타임에 대한 정보를 인코딩하고, 암호화된 키로 서명하여 변조에 강하게 만든다.

 

Supabase 의 액세스 토큰은 JWTs 이다. `JWT`는 서비스로 모든 요청과 함께 전송되는데, 토큰을 확인하고 포함된 요청을 검사함으로써 리소스에 대한 액세스를 허용하거나 거부할 수 있다.

RLS(Row Level Security) 정책은 JWTs 의 정보를 기반한다.

 

JWT 인코딩 및 서명

https://jwt.io/

 

JWT 는 아래와 같이 인코딩된다.

{
  "sub": "0002",
  "name": "Věra Hrabánková",
  "iat": 1516239022,
  "exp": 1518239022,
  "theme": {
    "primary" : "#D80C14",
    "secondary" : "#FFFFFF"
  }
}
  • `sub` : 제목
  • 'name` : 설명
  • `iat` : 생성일자(Unix timestamp)
  • `exp` : 만료일자 
  • theme 과 같이 저장하고자 하는 정보들을 담을 수 있다.

 

사용자에게 JWT 을 전송할 때 HS256 과 같은 알고리즘을 사용하여 데이터를 인코딩한다.

// from https://replit.com/@awalias/jsonwebtokens#index.js
let token = jwt.sign({ name: 'Sam Vimes' }, 'some-secret')

그 결과 세 가지 문자열로 구성된다.

eyJhbGciOiJIUzI1NiJ9
  .eyJzdWIiOiIwMDAxIiwibmFtZSI6IlNhbSBWaW1lcyIsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNTE4MjM5MDIyfQ
  .zMcHjKlkGhuVsiPIkyAkB2rjXzyzJsMMgpvEGvGtjvA
  • 첫번째 segment(`header`) : 어떤 알고리즘이 인코딩을 수행했는지 알려준다.
  • 두번째 segment(`payload`)
  • 세번째 segment(`signature`) : 사용자가 보낸 토큰이 합법적인지 확인하기 위해 서비스 또는 웹 사이트에서 제공
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload)
  <jwt_secret>
)

 

Supabase 에서의 JWTs

Supabase 에서의 JWTs 는 세 가지 목적이 있다.

  • `anon key` : Supabase API 게이트웨이 우회(데이터베이스와 상호작용)
  • `service role key` : 관리자 권한을 가지고 RLS 우회(비공개 키)
  • `user specific jwts` : 로그인한 사용자에게 발행하는 토큰(콘텐츠 or 권한 액세스)

`anon key` 토큰은 데이터베이스와 상호작용할 때 API 요청과 함께 보내는 토큰이다.

curl 'https://xscduanzzfseqszwzhcy.supabase.co/rest/v1/colors?select=name' \
-H "apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYxNDIwNTE3NCwiZXhwIjoxOTI5NzgxMTc0fQ.-NBR1WnZyQGpRLdXJfgfpszoZ0EeE6KHatJsDPLIX8c"

// decode
{
  "role": "anon",
  "iss": "supabase",
  "iat": 1614205174,
  "exp": 1929781174
}

 

`service role key` 토큰은 사용자와 공유하면 안 되는 key 로 이 토큰으로 데이터 일괄 삽입과 같은 작업을 수행할 수 있다.

 

`user access token` 은 사용자가 로그인할 때 발행되는 JWT 이다. 이 토큰은 Authorizatsion Bearer 헤더로 전달되어야 한다. 사용자에 대한 정보를 포함하기 때문에 길이가 길다.

{
  "aud": "authenticated",
  "exp": 1615824388,
  "sub": "0334744a-f2a2-4aba-8c8a-6e748f62a172",
  "email": "d.l.solove@gmail.com",
  "app_metadata": {
    "provider": "email"
  },
  "user_metadata": null,
  "role": "authenticated"
}

 

 


728x90
반응형