Skip to content

[Back] 서비스 회원가입, 로그인 기능 개발 - feature/account-login #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
23 of 38 tasks
robert-min opened this issue Jan 29, 2024 · 3 comments
Open
23 of 38 tasks
Assignees
Labels
Backend Backend task(ex. 서버 개발)

Comments

@robert-min
Copy link
Contributor

robert-min commented Jan 29, 2024

📌 Description

서비스 사용을 위한 회원가입, 로그인 기능을 개발합니다.


🎈 Goal

$\tiny{구체적인\ 산출물을\ 포함한\ 목표를\ 작성해주세요.}$

  • 사용자 저장 DB 리서치(PostgreSQL)
  • 회원가입 기능 개발
  • 로그인 기능 개발
  • 로그인 데코레이터 적용

✏️ Todo

$\tiny{목표\ 달성을\ 위해\ 해야할\ 일을\ 세부적으로\ 작성해주세요.}$

  • DB 리서치
  • Session Cookie vs JWT 토큰 리서치
  • DB 인프라 구축
    • 스키마 작성
    • Azure CosmosDB PostgreSQL 구축
  • 회원가입 기능 개발
    • repository
      • 사용자 계정 정보 저장(insert_user_account)
      • 사용자 계정 정보 확인(get_user_account)
    • service
      • 사용자 회원가입(signup_user_account)
    • controller
      • 사용자 회원가입 요청(POST, account/signup)
    • libs
      • 사용자 패스워드 암호화(encrypt)
      • 사용자 패스워드 복호화(decrypt)
  • 로그인 기능 개발
    • service
      • 사용자 로그인(login_user_account)
    • controller
      • 사용자 로그인 요청(POST, account/login)
    • lib
      • JWT 토큰 생성(jwt_manager)

추가 개발 사항(Demo 이후)

  • 사용자 업데이트 기능 개발
    • repository
    • 사용자 계정 정보 수정(update_user_account)
    • service
      • 사용자 계정 정보 수정(change_user_account)
    • controller
      • 사용자 계정 정보 수정 요청(POST, account)
  • 관리자 용 사용자 기능 개발
    • repository
      • 사용자 계정 정보 상태 변경(update_user_account_status)
    • service
      • 사용자 계정 상태 정보 비활성화(disable_user_account)
      • 사용자 계정 상태 정보 활성화(activate_user_account)
    • controller
      • 사용자 계정 상태 정보 수정(POST, admin/status)
@robert-min robert-min added the Backend Backend task(ex. 서버 개발) label Jan 29, 2024
@robert-min robert-min self-assigned this Jan 29, 2024
@robert-min
Copy link
Contributor Author

DB 리서치

MySQL

특징

  • 성능: MySQL은 대량의 트랜잭션을 다루는 데 탁월한 성능
  • 간편성: 설치와 설정이 비교적 쉽고, 사용하기 쉬운 인터페이스를 제공
  • 확장성: MySQL은 수평 및 수직으로 확장이 가능
  • 커뮤니티: MySQL은 오픈 소스이며, 커뮤니티 지원이 활발

장점

  • 간단한 설정과 사용법
  • 대부분의 웹 애플리케이션과 호환성이 높음
  • 높은 성능을 제공

단점

  • ACID(원자성, 일관성, 고립성, 지속성) 특성을 제대로 준수하지 않을 수 있음
  • 대규모 트랜잭션 처리에는 부적합할 수 있음
  • 비교적 제한된 기능과 확장성

PostgreSQL

특징

  • 확장성: PostgreSQL은 풍부한 기능과 확장 가능성을 제공. 사용자 정의 데이터형, 함수, 인덱스 등을 생성 가능.
  • ACID 준수: PostgreSQL은 데이터 무결성을 유지하기 위해 ACID 특성을 준수
  • 풍부한 데이터 형식: PostgreSQL은 JSON, XML 등 다양한 데이터 형식을 지원
  • 선택적인 일관성 수준: 사용자가 일관성 수준을 선택 가능
  • 확장성: PostgreSQL은 대용량 및 고성능 데이터베이스에 적합

참고 : ACID?

  • 원자성 (Atomicity): 트랜잭션의 모든 연산은 원자적으로 실행되어야 합니다. 이것은 트랜잭션이 완전히 성공하거나 완전히 실패해야 함을 의미합니다. 즉, 트랜잭션이 중간 단계에서 실패하면 모든 변경 사항이 롤백되어야 합니다.
  • 일관성 (Consistency): 트랜잭션 완료 후 데이터베이스는 일관된 상태여야 합니다. 즉, 트랜잭션이 실행되기 전과 후에 데이터베이스의 일관성이 유지되어야 합니다. 데이터베이스의 제약 조건에 위배되지 않아야 합니다.
  • 고립성 (Isolation): 동시에 여러 트랜잭션이 실행될 때, 각각의 트랜잭션은 다른 트랜잭션에 영향을 받지 않는 것처럼 실행되어야 합니다. 즉, 한 트랜잭션이 실행 중인 데이터에 대한 변경 사항을 다른 트랜잭션이 볼 수 없어야 합니다.
  • 지속성 (Durability): 성공적으로 완료된 트랜잭션에 대한 변경 사항은 영구적으로 유지되어야 합니다. 시스템 장애나 기타 문제가 발생해도 데이터베이스의 일관성이 유지되어야 합니다.

장점

  • ACID 특성을 완전히 준수함
  • 풍부한 기능과 데이터 형식을 제공함
  • 대규모 트랜잭션 및 복잡한 쿼리 처리에 적합함

단점

  • MySQL에 비해 상대적으로 더 복잡한 설정과 관리가 필요할 수 있음
  • 성능 면에서 MySQL보다 뒤지는 경우가 있을 수 있음
  • 커뮤니티 지원이 MySQL에 비해 상대적으로 부족할 수 있음

비교

  • 성능: MySQL은 작은 및 중간 규모의 애플리케이션에 적합하며, PostgreSQL은 대규모 및 복잡한 데이터베이스 시스템에 적합합니다.
  • ACID 준수: PostgreSQL은 ACID 특성을 완전히 준수하며, MySQL은 부분적으로만 준수할 수 있습니다.
  • 확장성: PostgreSQL은 더 복잡한 쿼리 및 데이터 형식을 다룰 수 있으며, MySQL은 간단한 애플리케이션에 적합합니다.
  • 설정 및 관리: MySQL은 간단하게 설정하고 사용할 수 있지만, PostgreSQL은 더 복잡한 설정 및 관리가 필요할 수 있습니다.
  • 커뮤니티: MySQL은 더 널리 사용되며, 커뮤니티 및 지원이 더 활성화되어 있습니다.

현재 프로젝트 기준 데모버전으로 큰 데이터가 들어가지는 않지만, 서비스 이용에따라 사용자 피드백을 저장하는 테이블이 추후 들어가는 등 서비스 확장성을 고려하여 MySQL이 아닌 PostgreSQL 진행

@robert-min
Copy link
Contributor Author

Session Cookie vs JWT 토큰 리서치

세션 쿠키(Session Cookie):

동작 방식

  1. 사용자가 인증 정보를 제출하면, 서버는 사용자를 인증하고 세션 ID를 생성합니다.
  2. 이 세션 ID는 서버 측에서 관리되는 데이터 저장소(일반적으로 메모리나 데이터베이스)에 저장됩니다.
  3. 세션 ID는 클라이언트에게 쿠키로 전송됩니다. 이후 클라이언트는 모든 요청에 이 세션 ID를 함께 보냅니다.
  4. 서버는 세션 ID를 확인하여 사용자를 인증하고 해당 세션에 저장된 데이터를 사용합니다.

장점

  • 서버 측에서 세션을 관리하기 때문에 보안에 강합니다.
  • 세션 데이터는 클라이언트에 저장되지 않기 때문에 XSS 공격에 노출될 위험이 낮습니다.
  • 세션은 서버 측에서 유연하게 관리되므로, 세션의 만료 및 재생성 등을 조정할 수 있습니다.

단점:

  • 세션 데이터 저장소에 대한 추가적인 관리 및 저장소가 필요합니다.
  • 서버를 확장하거나 분산시킬 때 세션 관리의 복잡성이 증가할 수 있습니다.

JWT (Json Web Token):

동작 방식

  1. 사용자가 인증 정보를 제출하면, 서버는 JWT를 생성하여 클라이언트에게 반환합니다.
  2. 이 JWT는 인코딩된 형태로, 클라이언트 측에서 저장되거나 전송됩니다.
  3. 클라이언트가 요청을 보낼 때마다 JWT를 함께 보냅니다.
  4. 서버는 JWT의 유효성을 검증하여 사용자를 인증합니다.

장점

  • 서버 측에서 상태를 저장할 필요가 없기 때문에, 서버 확장이 용이합니다.
  • 클라이언트 측에서 토큰을 저장하므로, 서버 부하를 줄일 수 있습니다.

단점

  • 토큰에 저장된 정보는 클라이언트 측에서 디코딩될 수 있기 때문에, 정보가 노출될 수 있는 보안 위험이 있습니다.
  • 토큰의 크기가 커질 수 있고, 매 요청마다 전송되므로 대역폭을 소모할 수 있습니다.
  • 토큰이 한 번 발급되면 유효기간이 만료될 때까지 변경되지 않습니다.

요약

  • 세션 쿠키는 보안성이 높고, 서버 측에서 세션을 관리합니다.
  • JWT는 확장성이 뛰어나고, 서버 측에서 상태를 유지할 필요가 없습니다.
  • 보안적인 측면에서는 세션 쿠키가 더 안전하나, JWT는 확장성과 토큰 기반의 인증 시스템을 구축하기에 적합합니다.

현재 프로젝트 기준 보안 상의 중요한 이슈가 없고, 서비스 확장성을 고려하여 JWT 토큰 인증방식을 사용해서 진행

@robert-min robert-min changed the title [Back] 서비스 회원가입, 로그인 기능 개발 [Back] 서비스 회원가입, 로그인 기능 개발 - feature/account-login Jan 29, 2024
@robert-min
Copy link
Contributor Author

robert-min commented Jan 29, 2024

DB 인프라 구축

스키마 설정

  • db 이름 : art

user_account

-- art 데이터베이스 생성
CREATE DATABASE art;

-- art 데이터베이스로 연결
\c art;

-- user_account 테이블 생성
CREATE TABLE user_account (
    seq BIGSERIAL PRIMARY KEY,
    id VARCHAR(500) NOT NULL,
    password BYTEA NOT NULL,
    name VARCHAR(500) NOT NULL,
    gender VARCHAR(20) NOT NULL,
    age VARCHAR(200) NOT NULL,
    status BOOLEAN NOT NULL DEFAULT TRUE
);

-- user_account 테이블 삭제
DROP TABLE user_account;

-- user_content 테이블 생성
CREATE TABLE user_content (
    seq BIGSERIAL PRIMARY KEY,
    id VARCHAR(500) NOT NULL,
    generated_id VARCHAR(500) NOT NULL
);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Backend Backend task(ex. 서버 개발)
Projects
None yet
Development

No branches or pull requests

1 participant