Ssul's Blog

인증, 로그인 정리(쿠키, 세션, 토큰) 본문

dev/까먹지마

인증, 로그인 정리(쿠키, 세션, 토큰)

Ssul 2023. 2. 10. 15:17
인증의 3가지 종류
  • 쿠키: 클라이언트(브라우저)에 쿠키값이 저장
  • 세션: 세션값이 서버에 저장되는 것
  • 토큰: 서버 호출시 토큰 전달, 서버에 저장된 토큰정보로 인증 확인

 

쿠키인증 프로세스
  1. 클라이언트가 request(id & pw) → 서버가 로그인 체크하고 성공이면 → 서버에서 쿠키값 생성
  2. 서버에서 클라이언트로 쿠키값 보냄(response.headers에 set-cookie 값을 보냄(Set-Cookie: <cookie-name>=<cookie-value>))
  3. 클라이언트는 response.headers에 있는 쿠키를 브라우저에 쿠키값 저장(<cookie-name>=<cookie-value>
  4. 앞으로 서버 소통시 브라우저가 쿠키값을 가지고 있어서 소통가능해짐

 

세션인증 프로세스
  1. 클라이언트가 request(id & pw) → 서버가 로그인 체크하고 성공이면 → 인증정보 생성하여 세션 저장소에 저장
  2. 유저에 session_id부여 -> 클라이언트에게 전달(response.headers.Set-Cookie:session_id=x2yce2xxxxxxxxxxxx)
  3. 유저는 부여받은 sessionid를 가지고, 소통
  4. 브라우져가 닫히면, 세션이 삭제됨

 

토큰인증 프로세스
  1. 클라이언트가 request(id & pw) → 서버가 로그인 체크하고 성공이면 → 서버에 토큰 생성
  2. 토큰을 클라이언트한테 보냄  클라이언트는 토큰을 저장해두었다
  3. 다음부터 해더에 토큰넣어서 소통(Authorization: “Bearer ${JWT_TOKEN}”)
  4. 서버에 있는 토큰정보랑 비교해서 소통허용

 

장고에서 로그인 사용 예시

1. 프론트에서 id, pw입력해서 백엔드 로그인 api 호출

2. 백엔드에서 request에 들어있는 id, pw 확인하고, 있으면 user객체 가져옴

def authorize_with_email(request: HttpRequest):
    password = request.data.get("password")
    email = request.data.get("email")
    username = hashlib.md5(email.encode()).hexdigest()
    # 자격증명이 유효하면 user객체생성
    user = authenticate(username=username, password=password)
    if user is None:
        raise NotFound(_("email or password is wrong"))

    # 자격증명이 유효하여, 장고의 세션에 저장(사실은 우리가 만든 함수로 이동)
    login(request, user)
    return Response({"msg": 'ok',
                     "accessToken": request.data['accessToken']})

3. 가져온 user객체로 login함수 호출: djanog auth에 있는 로그인 함수로 로그인 진행 후, 유저고유의 토큰을 생성하여 db저장

def login(request: HttpRequest, user: User):
    # 로그인 후 -> 세션에 저장
    django_login(request, user)

    # 토큰 있는지 보고, 없으면 토큰생성
    token = Token.objects.filter(user_id=user.id).first()
    if not token:
        token = Token(user_id=user.id)
        token.save()

    request.data['accessToken'] = token.key