인증
user_list = [
{"user_id":"lee", 'password':'1234'},
{"user_id":"kim", 'password':'2345'},
{"user_id":"park", 'password':'3456'}
]
# Decoded Algorithms
def decode_hashed_password(hashed_password: str):
hashed_password = hashed_password[::-1]
return hashed_password
# Create ticket Algorithms
def create_client_ticket(user_id: str):
user_ticket = user_id
return user_ticket
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.post("/login")
async def login(user_id: Annotated[str, Body()], password: Annotated[str, Body()]): # 로그인할때 파라미터 UserID, Password
client_ticket = None
for user_info in user_list: # UserID 존재 여부 확인
if user_id == user_info["user_id"] :
_db_password = user_info["password"]
decoded_password = decode_hashed_password(_db_password)
if password == decoded_password:
client_ticket = create_client_ticket(user_id)
if client_ticket is not None:
return {"clientTicket": client_ticket}
else:
return {"message": "login failed"}
로그인할 때 필요한 파라미터는 UserID와. Password
유저 아이디가 서버에 존재하는지 확인하고, 유저 아이디가 존재할 경우 비밀번호를 확인하는 순서를 거친다.
- 유저아이디 존재 할 경우, 비밀번호 확인
- 비밀번호는 사용자는 서버에게 비밀번호를 보낼 때, 서버가 알아보지 못하는 값으로 서버에 들어가며, 서버는 실제 저장된 비밀번호와 유저가 보낸 비밀번호를 해독하여 일치하는지 확인해야 된다. 만약 해독된 비밀번호가 유저가 보낸 비밀번호와 일치한다면 로그인시켜 준다.
- 해당 유저 아이디를 세션에 저장해 둔다.
- 클라이언트에 임시티켓을 발급하여 그 이후에도 쓸 수 있게 되돌려 주어야 함.
토큰
유저아이디, 생성된 날짜, 유효 기간 정보를 이용하여 만들어진 암호화된 결과물
JWT
API 서비스에서 사용자를 인증하는 방식 중 하나
# JWT 기본 설정
SECRET_KEY = '' # JWT 생성 및 검증을 위한 비밀 키
ALGORITHM = 'HS256' # JWT 알고리즘
ACCESS_TOKEN_EXPIRE_MINUTES = 30 # 액세스 토큰의 만료 시간(분)
JWT token 만들기
def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
DB 연동
ORM(Object Relational Mapping)
ORM은 "Object Relational Mapping"의 약자로, 객체와 관계형 데이터베이스 간의 데이터를 변환하고 상호작용하는 프로그래밍 기술 또는 패턴을 나타냅니다. ORM은 객체 지향 프로그래밍 언어에서 사용되는 객체와 관계형 데이터베이스의 데이터와 관계를 매핑하고 연결하여 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있게 해 줍니다.
기본적으로 관계형 데이터베이스에서는 데이터는 테이블로 구성되며, 이러한 데이터를 객체 지향 프로그래밍 언어에서 사용하는 객체로 변환하는 작업은 번거로울 수 있습니다. ORM은 이러한 번거로움을 줄이고 개발자가 객체로서 데이터를 조작할 수 있도록 도와줍니다.
ORM의 주요 기능 및 특징
객체와 테이블 간의 매핑: ORM은 객체와 데이터베이스 테이블 간의 매핑을 제공하여 개발자가 SQL 쿼리 없이 객체를 데이터베이스에 저장하고 검색할 수 있게 해 줍니다.
- CRUD 작업: ORM을 사용하면 데이터베이스에서의 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete) 작업을 객체 지향적인 방식으로 처리할 수 있습니다.
- 객체 간의 관계: ORM은 객체 간의 관계를 지원하여 데이터베이스에서의 관계를 객체로 표현할 수 있습니다. 예를 들어, 부모-자식 관계를 객체의 포함 관계로 표현할 수 있습니다.
- 데이터베이스 추상화: ORM은 데이터베이스 시스템 간의 차이를 추상화하여 개발자가 여러 종류의 데이터베이스를 사용하더라도 일관된 방식으로 작업할 수 있게 합니다.
- SQL 생성 및 최적화: ORM은 개발자가 직접 SQL 쿼리를 작성하지 않아도 필요한 쿼리를 자동으로 생성하고 최적화할 수 있는 기능을 제공한다
SQLAlchemy
SQLAlchemy
The Database Toolkit for Python
www.sqlalchemy.org
https://github.com/sqlalchemy/sqlalchemy
GitHub - sqlalchemy/sqlalchemy: The Database Toolkit for Python
The Database Toolkit for Python. Contribute to sqlalchemy/sqlalchemy development by creating an account on GitHub.
github.com
본 후기는 정보통신산업진흥원(NIPA)에서 주관하는 <AI 서비스 완성! AI+웹개발 취업캠프 - 프런트엔드&백엔드> 과정 학습/프로젝트/과제 기록으로 작성되었습니다.