2024. 5. 30. 23:16ㆍTIL
개인 숙련 과제를 하며 작성된 질문에 대한 답변을 정리하였습니다.
학습질문&답변
1. ERD를 작성할 때 Relation은 무엇이며, Relation의 종류 3가지를 예시를 들어 설명해 주세요.
- ERD는 관계형 데이터베이스의 테이블끼리 관계를 맺는 것으로 여기서 Relation은 두 개 이상의 테이블간의 연관관계라 볼 수 있다. Relation의 종류는 1:1, 1:N, N:M 이 있습니다. 첫 번째 1:1관계로 사용자와 사용자정보의 관계를 떠올려 보면 하나의 사용자에겐 하나의 정보만 존재하기 때문에 이러한 경우 1:1 관계를 맺고 있다고 볼 수 있습니다. 두번째 1:N의 관계로 하나의 게시판에 여러 개의 댓글을 달 수 있습니다. 이 경우 게시판과 댓글은 1:N 관계를 맺습니다. 세 번째 N:M 관계로 사용자와 댓글을 예를 들면 사용자는 여러 개의 댓글을 달 수 있으며, 댓글은 다수의 사용자들이 작성하기 때문에 이러한 관계를 N:M관계라 볼 수 있습니다.
2. 비밀번호를 DB에 저장할 때 Hash를 이용했는데, Hash는 단방향 암호화와 양방향 암호화 중 어떤 암호화 방식에 해당할까요?
- Hash는 평문을 암호화하지만 암호화를 평문으로 바꿀 수 없기 때문에 단방향 암호화 방식을 사용합니다.
3. 비밀번호를 그냥 저장하지 않고 Hash 한 값을 저장 했을 때의 좋은 점은 무엇인가요?
- Hash한 값은 복호화 할 수 없기 때문에 보완성이 좋습니다.
4. JWT(Json Web Token)을 이용해 인증 기능을 했는데, 만약 Access Token이 노출되었을 경우 발생할 수 있는 문제점은 무엇일까요? 위에 문제점을 보완하기 위한 방법으로는 어떤 것이 있을까요?
- Access Token은 사용자 인증에 필요한 모든 정보를 가지고 있습니다. 그렇기 때문에 토큰을 가지고 있는 시간이 늘어날 수록 탈취되었을 때 피해 규모는 더 커지게 됩니다. 또한 토큰이 탈취되더라도 서버에서는 해당 토큰이 탈취된 토큰인지 알 수 없으며 강제로 만료시킬 수도 없습니다. 이러한 문제점을 보완하기 위해 Refesh Token을 사용하여 사용자정보를 인증받고 Access Token을 발급받아 유효기간을 짧게 설정해두어 노출이 되더라도 피해를 최소화시킵니다.
5. JWT를 이용한 인증 시 Cookie를 이용한 방식과 Header를 이용한 방식이 있는데, 각각은 어떤 상황에 사용하는 것이 적합한가요?
- Header를 이용한 방식은 명시적으로 토큰을 추가하고 관리할 수 있어 많은 제어를 가질 수 있습니다. 그리고 서버는 상태를 유지할 필요가 없으며 요청들은 자체적으로 인증됩니다.
Cookie를 이용한 방식은 브라우저가 자동으로 쿠키를 서버로 전송하기 때문에 명시적으로 토큰을 첨부할 필 요가 없습니다. 따라서, Cookie를 이용한 방식은 보안을 강화할 수 있는 옵션이 많기 때문에 보안이 중요한
작업을 할때 적합하고 Header를 이용한 방식은 클라이언트 측에서 토큰을 관리해야 하는 상황에 적합합니 다.
6. 인증과 인가가 무엇인지 각각 예시를 들어 설명해 주세요.
- 인증은 서비스를 이용하려는 사용자가 인증된 정보를 가진 사람인지 검증하는 것으로 사이트에서 로그인하는 기능에 해당합니다.
인가란 인증된 사용자가 특정 데이터에 접근하거나, 특정 작업을 행할 수 있는 권한이 있는 지를 검증합니다. 로그인된 사용자만 게시글을 작성할 수 있다면 작성시 로그인된 사용자인가 확인하는 것이 인가에 해당합니다.
7. Transaction이 무엇이며, 어떤 경우에 사용해야 하나요?
- 트랜잭션은 작업의 완전성을 보장해주는 것으로 특정 작업을 전부 처리하거나 전부 실패하게 만들어 데이터의 일관성을 보장해줍니다. 트랜잭션은 연관된 작업을 할때 사용됩니다.
예를 들어보면, 비행기 좌석을 예매하는 상황 중 좌석을 선택하는 작업을 한 뒤 결제하는 작업을 하던 중에 오류가 발생하여 결제가 취소될 경우 결제만 취소되고 좌석을 선택한 작업이 취소되지 않는다면 좌석이 계속 선택되어 있어 다른 이용자가 해당 좌석을 선택할 수 없게 됩니다. 이러한 문제를 해결하기 위해 트랜잭션을 사용하여 결제취소시 앞서 행한 좌석선택 작업도 함께 취소되게 합니다.
8. MySQL, Prisma로 개발했는데 MySQL을 MongoDB로 그리고 Prisma를 mongoose로 변경하게 된다면 많은 코드 변경이 필요할까요? 주로 어떤 코드에서 변경이 필요한가요?
- Mysql에서 데이터모델 정의시 prisma 파일을 사용하여 데이터구조를 정의하고, MongoDB에서는 Mongoose 스키마를 사용하여 데이터구조를 정의합니다. 또한 CRUD작업과 쿼리작성도 sql과 json의 방식으로 나뉘어 변경됩니다.
추가적으로 Mysql은 트랜잭션을 지원하지만, MongoDB의 경우 트랜잭션 지원이 제한적이기 때문에 트랜잭션을 사용했다면 이 부분도 재설계 해야 할 수 있습니다.
9. 만약 이렇게 DB를 변경하는 경우가 발생했을 때, 코드 변경을 보다 쉽게 하려면 어떻게 코드를 작성하면 좋을 지 생각나는 방식이 있나요? 있다면 작성해 주세요.
- api 명세서를 통해 코드를 변경하게 되더라도 기준을 잡을 수 있지 않을까 생각합니다.
*9번 질문은 아직 명확하게 방법이 떠오르지 않아 추후에 추가하여야 할 거 같습니다.
'TIL' 카테고리의 다른 글
TIL ( Git/GitHub non-fast-forword 오류 ) (0) | 2024.06.03 |
---|---|
TIL (쿼리스트링, URL 파라미터, Body) (0) | 2024.05.31 |
TIL ( Transaction ) (0) | 2024.05.29 |
TIL (Access Token & Refresh Token) (0) | 2024.05.28 |
TIL (배열Method- find, map, filter) (0) | 2024.05.27 |