ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Project] 회원가입 - 로그인
    프로젝트/Movie-Ticketing 2024. 1. 24. 19:02
    728x90

    회원 가입


    회원 모델

    먼저 회원 정보를 위한 모델이 필요하다. 회원 정보 모델에는 최소한 다음과 같은 속성이 필요하다.

     

    id는 자동으로 증가하는 User 모델의 기본 키이다. username, password 에는 null값을 허용하지 않도록 nullable=False로 설정했다. username에는 unique=True를 지정하려 한다. unique=True는 "같은 값을 저장할 수 없다"를 뜻한다. 이렇게 해야 username이 중복되어 저장되지 않는다.

    회원 가입 API 명세

    POST /user/create - 사용자 가입

    • Input: 사용자 이름, 비밀번호
    • Output: 없음

    회원 가입 스키마

    회원가입 API의 입력 항목으로 사용할 스키마를 다음과 같이 만들려고 한다.

    class UserCreate(BaseModel):
        username: str
        password1: str

     

    not_empty 메서드를 만들어서 해당 항목에 빈 값이 입력되지 않도록 할 예정이다.

    회원 가입 CRUD

    회원 데이터를 생성할 때 유의해야할 사항이 있다. 그것은 바로 입력 받은 비밀번호의 값이다. 비밀번호는 탈취되더라도 복호화 할 수 없는 값으로 암호화 해서 저장해야 한다. Python을 사용하고 있다면 bcrypt 라이브러리(비크립트)를 사용해 쉽게 비밀번호를 암호화 할 수 있다.

     

    이 후 로그인시 사용자로 부터 입력받은 비밀번호를 동일한 방식으로 암호화한 후 데이터베이스에 저장된 값과 비교하여 비밀번호가 동일한지 체크할 수 있다. (이러한 이유로 암호화한 비밀번호는 복호화가 필요없다.)

     

    동일한 사용자명 또는 이메일이 이미 존재할 경우 "이미 존재하는 사용자입니다" 라는 오류를 발생하게 할 예정이다.

    FastAPI의 docs 문서에서 동일한 사용자명 또는 동일한 이메일로 회원 가입을 시도하려고 하면 오류가 발생하는 것을 확인할 수 있도록 한다.

     


    로그인


    로그인은 FastAPI의 OAuth2 인증을 사용할 것이다. FastAPI의 OAuth2 인증은 fastapi의 security 패키지를 이용하여 쉽게 구현할 수 있다.

     

    POST /login - 사용자 로그인

    • Input: 사용자 이름, 비밀번호
    • Output: 인증 토큰

    인증 토큰을 좀 더 세분화하면 다음과 같을 것이다.

    • access_token - 액세스 토큰
    • token_type - 토큰의 종류 (Bearer로 고정하여 사용한다. Bearer는 JWT 또는 OAuth의 토큰방식을 의미한다.)

    로그인 후 받아온 액세스 토큰은 영화 예매 등 로그인이 필요한 API를 호출할때 필요하다.

    FastAPI의 라우팅 함수는 HTTP 헤더에 담긴 액세스 토큰을 통해 사용자명과 토큰의 유효기간을 확인하도록 한다.

    따라서 클라이언트 단에서는 로그인의 결과로 받은 액세스 토큰을 저장해 두었다가 API를 호출 할 때마다 HTTP 헤더에 액세스 토큰을 담아 요청해야 한다.

     

    로그인 스키마

    로그인 API의 입력 스키마는 fastapi의 security 패키지에 있는 OAuth2PasswordRequestForm 클래스를 사용하므로 따로 만들 필요가 없다. 출력항목에 해당하는 스키마만 다음과 같이 작성하려고 한다.

    class Token(BaseModel):
        access_token: str
        token_type: str

    로그인 API의 출력 항목인 access_token, token_type을 속성으로 하는 Token 스키마를 만들었다.

     

    먼저 로그인 API의 입력항목인 username과 password의 값을 확인한다. username을 사용하여 사용자 모델 객체(user)를 조회하여 가져온다. 그리고 입력으로 받은 password와 데이터베이스에 저장된 사용자의 비밀번호가 일치하는지 조사한다.

     

    암호화 되지 않은 비밀번호를 암호화하여 데이터베이스에 저장된 암호와 일치하는지 판단한다. 만약 데이터베이스에서 해당 사용자를 찾지 못하거나 비밀번호가 일치하지 않는 경우에는 HTTP 401오류를 리턴한다

     

    jwt(Json Web Token)를 사용하여 액세스 토큰을 생성한다.

    jwt란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.

    jwt - https://jwt.io/

     

    JWT.IO

    JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

    jwt.io

    sub 항목에 사용자명을 저장하고 exp 항목에 토큰의 유효기간을 설정하여 토큰을 생성한다. 이 때 다음과 같은 3가지 정보가 필요하다.

    • ACCESS_TOKEN_EXPIRE_MINUTES - 토큰의 유효기간을 의미한다. 분 단위로 설정한다.
    • SECRET_KEY - 암호화시 사용하는 64자리의 랜덤한 문자열이다.
    • ALGORITHM - 토큰 생성시 사용하는 알고리즘을 의미하며 여기서는 HS256을 사용한다.

    이렇게 반환받은 token의 값을 api요청의 헤더에 포함시키도록 구현할 예정이다.

    728x90
Designed by Tistory.