카테고리 없음

(깊은 복사와 얕은 복사), (JWT) 본캠프 TIL

parkcw0325 2025. 2. 13. 20:46

7 번째 질문 (깊은 복사와 얕은 복사)에 대하여 설명하시오. 

 

  • 얕은 복사 (Shallow Copy)
    • 객체의 겉부분(최상위 속성)만 복사합니다.
    • 만약 속성 중에 또 다른 객체가 있다면, 그 내부 객체는 원본과 같은 것을 가리킵니다.
    • 즉, 복사본에서 내부 객체의 값을 바꾸면 원본에도 변화가 생깁니다.
  • 깊은 복사 (Deep Copy)
    • 객체 내부의 모든 값을 새롭게 복사합니다.
    • 내부 객체도 독립적인 새로운 객체로 만들어지므로, 복사본을 수정해도 원본은 변화하지 않습니다.

 

얕은 복사 예시

 

 

const originalObj = { a: 1, b: { c: 2 } };

// 얕은 복사: 최상위 속성만 복사 (내부 객체 b는 같은 주소를 참조)
const shallowCopy = { ...originalObj };

// 복사본의 내부 값 변경
shallowCopy.b.c = 100;

// 내부 객체가 공유되므로 원본도 변경됨
console.log(originalObj.b.c); // 출력: 100

 

깊은 복사 예시

const originalObj2 = { a: 1, b: { c: 2 } };

// 깊은 복사: 전체 객체를 문자열로 변환 후 다시 객체로 만들어 완전히 새롭게 복사
const deepCopy = JSON.parse(JSON.stringify(originalObj2));

// 복사본의 내부 값 변경
deepCopy.b.c = 200;

// 깊은 복사에서는 내부 객체도 새로 만들어지므로 원본은 변화하지 않음
console.log(originalObj2.b.c); // 출력: 2

 

꼬리질문 및 답변 예시

  • 질문: 얕은 복사와 깊은 복사의 장단점은 무엇인가요?
    답변:
    • 얕은 복사:
      • 장점: 빠르고 메모리 사용이 적음
      • 단점: 중첩 객체 변경 시 원본에 영향을 미침
    • 깊은 복사:
      • 장점: 독립적인 복사본 생성으로 안전한 데이터 조작 가능
      • 단점: 성능 저하 및 메모리 사용 증가, JSON 방법은 함수나 undefined 등의 값 복사 불가

 

  • 질문: JSON을 이용한 깊은 복사의 한계는 무엇인가요?
    답변:
    • JSON 방식은 함수, undefined, Date 객체, RegExp 등 특수 객체를 올바르게 복사하지 못하며, 순환 참조가 있는 객체는 처리할 수 없습니다.

 

8 번째 질문 (JWT)에 대하여 설명하시오. 

 

  • JWT는 사용자 인증 및 정보 교환을 위해 사용되는 JSON 기반의 토큰입니다.
  • 처리 위치:
    • 발급: 인증 서버에서 로그인 시 생성
    • 검증: API 서버 또는 미들웨어에서 토큰을 해석하여 검증 (예: jsonwebtoken 라이브러리 사용)
  • 검증 방식:
    • 서버는 비밀키(또는 공개키)를 사용해 JWT의 서명을 검증하여 토큰의 유효성을 확인합니다.
  • 재발급 방식 및 주기:
    • 액세스 토큰이 만료되면, 일반적으로 별도의 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급합니다.
    • 액세스 토큰의 만료 시간은 짧게(예: 1시간), 리프레시 토큰은 상대적으로 긴 주기(예: 1주일)로 설정합니다.
  • 다른 API 호출 시 인증 처리:
    • 클라이언트는 API 호출 시 HTTP 헤더(Authorization: Bearer <token>)에 JWT를 포함시켜 서버가 이를 검증하도록 합니다.

 

// JWT 관련 예시 (Node.js 환경, jsonwebtoken 라이브러리 필요)
const jwt = require('jsonwebtoken');
const secretKey = 'mySecretKey';

// 토큰 발급 예시
const payload = { userId: 123, role: 'user' };
const accessToken = jwt.sign(payload, secretKey, { expiresIn: '1h' });
const refreshToken = jwt.sign(payload, secretKey, { expiresIn: '7d' });

console.log('Access Token:', accessToken);
console.log('Refresh Token:', refreshToken);

// 토큰 검증 예시
try {
  const decoded = jwt.verify(accessToken, secretKey);
  console.log('Decoded Payload:', decoded);
} catch (error) {
  console.error('토큰 검증 실패:', error);
}

꼬리질문 및 답변 예시:

  • 질문: JWT의 만료 시간이 왜 중요한가요?
    답변:
    • JWT의 만료 시간은 보안상의 이유로 설정됩니다. 짧은 만료 시간은 토큰 탈취 시 악용 가능성을 줄이고, 만료된 토큰은 재발급을 통해 최신 사용자 정보를 반영할 수 있도록 합니다.
  • 질문: 리프레시 토큰과 액세스 토큰을 분리하는 이유는 무엇인가요?
    답변:
    • 액세스 토큰은 짧은 기간 사용되어 탈취 위험을 낮추며, 리프레시 토큰은 보다 안전한 저장소(예: httpOnly 쿠키)에 보관되어 새로운 액세스 토큰을 발급하는 역할을 합니다. 이로 인해 전체 시스템의 보안성을 높일 수 있습니다.
  • 질문: 다른 API 서버와 통신 시 JWT는 어떻게 활용되나요?
    답변:
    • 클라이언트가 API 서버에 요청 시 JWT를 HTTP 헤더에 포함하여 보내면, 각 API 서버는 해당 토큰을 검증하여 사용자 인증을 수행하고 권한을 확인합니다.