20240131

귤금·2024년 1월 31일

Node.js 4기 TIL

목록 보기
26/86

Today?

챌린지반 DB part.2

트랜잭션

트랜잭션의 성질 : ACID

  • ACID 룰을 보장하는 수단~!
  • 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행시키기 위한 작업의 단위
  • 또는 한꺼번에 모두 수행되어야 할 일련의 연산들
  • 예 : 호날두가 메시에게 입금
    1. 호날두의 계좌에서 100만원 차감
    2. 메시의 계좌에 100만원 추가

만약에 이 과정이 따로 처리가 된다면? 호날두의 계좌에서 100만원을 인출했는데 다른 계좌에 입금이 안되면 100만원은 증발됨... 그래서 이 과정들은 하나의 단계처럼 처리해야 한다. (메시의 계좌에 100만원을 더 줄 수 없으면 호날두 계좌의 100만원도 빠지지 않아야 함)

원자성? (Atomicity)

  • 모든 단계가 다 수행되면 수행되는 거고, 하나라도 실패하면 롤백! (원복)
  • 데이터의 일관성 유지함
CREATE PROCEDURE TransferMoney(IN account_id1 INT, IN account_id2 INT(
BEGIN
	DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
    	-- 하나의 쿼리라도 예외(에러) 발생하면 롤백~
        ROLLBACK;
    END;
    
    START TRANSACTION;
    UPDATE bank_accounts 
    SET balance = balance - 1000
    WHERE account_id = account_id1;
    UPDATE bank_accounts 
    SET balance = balance + 1000
    WHERE account_id = account_id2;
    
    COMMIT;
 END
    

호출

CALL TransferMoney(123123, 383838)
EXEC TransferMoney 123123, 383838

후자는 MySql에선 작동 안 하나?

함수의 시그니쳐

  1. return type
  2. 함수의 이름
  3. 함수의 인자

내가 운영하는 서비스가 있는데... 구독을 했는데 구독기간이 안 늘어난다...<같은 에러...

ACID 특성

  • A (원자성 : Atomicity)
  • C (일관성 : Consistency)
    • 무결성 제약을 깨트리는 트랜잭션은 실행되지 않음
      • 참조 무결성 제약
      • 예 : 게시판에 댓글 쓰는데 부모 게시글 ID가 없다면... 생성x
  • I (격리 : Isolation)
    • 독립적...? 다른 트랜잭션의 영향을 받지 않고 수행
      • 전대물에서 변신 다 끝날 때까지 기다려주는 느낌으로다가...
  • D (지속성 : Durability)
    • 트랜잭션이 수행되면 영원히 데이터베이스에 반영
    • 쿼리 로그에 아카이빙

정리!

  • 트랜잭션은 데이터의 정확성을 보장하고 데이터베이스의 상태를 일관성 있게 유지하는 데에 필수적이다.

데이터베이스 보안

접근제어(Access Control)

  • 데이터베이스는 외부/내부 사용자 모두에게 보호되어야 함
  • 특정 사용자가 데이터베이스의 어떤 부분에 접근할지 정의하는 보안 메커니즘
  • 인증/인가
    • 이 사용자가 메시인지 인증
    • 메시에게 SELECT 권한 인가

데이터 암호화

  • 평문을 암호문으로 변환하는 것
  • 복호화는 반대! 암호문을 평문으로 복원하는 것

암호화의 종류

  • 하나의 키로 복호화와 암호화 모두 가능하다면? 대칭키 암호화
  • 복호화 할 때 새로운 키가 필요하다면? 비대칭키 암호화 < 좀 더 안전
  • 그런데 만약에 복호화 없이 암호화된 값을 비교만 해서 사용한다면? 단방향 암호화 < 원본 데이터 보호

SQL Injection

admin'; --

prepared statement

Injection에 대비


Node.js 숙련주차 2주차

개인과제

인증

로컬 스토리지가 아닌 db에 refresh token을 저장하는 과정에서 자꾸 에러가 났다. JsonWebTokenError가 나는 경우 '토큰이 조작되었습니다.' 라는 에러 메시지를 송출하도록 코드를 짰는데 로그인 후 토큰을 정상적으로 생성하는데도 자꾸만 저 에러 메시지가 뜨는 거였다...

res.cookie('accessToken', `Bearer ${accessToken}`, { httpOnly: true });
res.cookie('refreshToken', refreshToken, { httpOnly: true });

해당 로직은 authorization 쿠키를 사용하여 로컬 스토리지에 Bearer 형식 토큰을 저장하기 위해 만들어졌다. 일반적으로, Bearer 토큰은 HTTP Authorization 헤더에서 사용된다고 함!
그러나 내가 해당 쿠키를 사용하지 않고 액세스 토큰과 리프래시 토큰을 발급하는 로직을 새로 짰기 때문에 Bearer 형식으로 명시한 게 문제가 되었다...
원래 쿠키에 토큰을 저장할 때는 일반적으로 Bearer 접두어 없이 토큰 값만 저장한다고 함...ㅠ 하루 종일 이것만 붙들고 있었던 것 같음

res.cookie('accessToken', accessToken, { httpOnly: true });
res.cookie('refreshToken', refreshToken, { httpOnly: true });

이렇게 수정했더니 간단히 해결됐다.


오늘 배운 것

회고

0개의 댓글