2024/06/05 TIL
스탠다드 수업 supabase authentication
회원관리 방법
1. authentication만 사용하고 public 스키마에 별도 user테이블 사용 X
장점 : 회원 가입, 로그인 처리, 회원 정보 관리 까지 단 하나의 auth.users 테이블에서 관리 가능
단점: join select가 불가능
join select 예시
posts안에 comments도 같이 불러오기 등
let {data: posts, error} = await supabase
.from('posts')
.select(
'*', user{
2. authentication과 user테이블을 둘 다 사용 (추천)
장점: join select 가능
단점: 회원가입 후 별도로 users 테이블에 데이터 추가명령 해줘야 하는 번거로움
users id, created_at, email, nickname, profile_img
인증 : 내가 회원임을 증명하는 것 (Authentication)
=> 입장권 구매 (로그인)
인가 : 회원이 특정 서비스에 접근할 수 있는 권한이 있는지 확인하는 절차 (Authorization)
=> 입장권으로 서비스 이용 (권한 필요한 API 요청)
로그인하면 로컬스토리지에 따로 만들어준다.
access token이 입장권 (심화주차에 배움)
우리가 했던 meta data안에 넣는 것은 권장 X
user테이블에 한 column에 데이터 하나만 들어가는 걸 권장
getSession 서버랑 상관없음
그냥 session 정보를 로컬스토리지에서 갖고오는 거
값이 있으면 로그인 상태, 없으면 로그아웃 상태
expires_in : 3600 1시간 뒤에 토큰 만료
1시간 뒤에 나가져야하는게 맞음
보안적으로 문제가 생길 수 있다.
getSession이 아니라 getUser로 해야 서버랑 상관있음
서버에서 토큰이 만료된 건지 아닌지 확인을 받을 수 있음
좀 더 안정적
둘 다 문제없음 상관없음
어차피 만료되면 알아서 supabase가
expires_in 변경가능
settings의 authentication에 advanced settings의 access token을 초단위로 바꿀 수 있음
갱신이 자동으로 안 될 때는 getUser로 안정적으로
인증이 필요 없는 api (보안이 필요없는 데이터)
로그인 없이도 조회가능한 게시물인 경우
await supabase.from('posts').select();
인증이 필요한 api (보안이 필요한 데이터)
로그인 해야만 게시물 접근이 가능한 경우
const isLogin = await checkSignin()하고
권한이 없는 경우 ㄲㅈ
if(!isLogin) {
return;
}
있으면 await supabase.from('posts').insert({title: "제목", content: "내용")
==> 걍 한 번에 해줄 수 있음
onAuthStateChange => 클라이언트(브라우저)에서 Authentication 서버를 지켜봄(auth.users)
단순히 로그인 여부에 따른 분기 처리가 필요할 때
const {data} = supabase.auth.onAuthStateChange(event, session) => {
console.log(event, session)
if(session) {
// 로그인 상태로 변경
} else {
//로그아웃 상태로 변경
}
}
서버 인장에서는 로그인, 회원가입, 로그아웃, 비밀번호 변경 등 모든 것이 이벤트
이거하면 걍 가만히 있으면 됨
이 CCTV를 어디에다가 실행하면 좋을 까?
보통 2가지
우리같은 경우에는
App.jsx에서 useEffect만들어서 실행시켜도됨
return 부분 : 클린업 함수 굳이 필요한 부분은 아니지만 그냥 세트로 씀
회원탈퇴
auth.user 테이블에서 user정보를 삭제하면 cascade로 해놓으면 연쇄적으로 관련된 것 다 삭제
삭제하려면 권한이 필요함