- 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주세요.
1. 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)
1.1 개념 차이
- 얕은 복사(Shallow Copy)
- 객체의 1차원 데이터(값)는 복사하지만, 중첩된 객체나 배열에 대해서는 참조값만 복사한다.
- 즉, 내부에 객체(Reference Type)가 있으면 원본과 사본이 같은 객체를 참조하게 되므로, 한쪽에서 내부 객체를 수정하면 다른 쪽에도 영향을 미친다.
- 깊은 복사(Deep Copy)
- 원본과 완전히 독립적인 새로운 객체를 생성한다.
- 중첩된 객체나 배열 내부 요소도 재귀적으로 전부 복사하므로, 원본을 변경해도 사본이 영향을 받지 않는다.
- JWT에 대해 설명해주세요. 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출 시 어떻게 잡아서 인증 처리하는지 말씀해주세요.
2. JWT(JSON Web Token)
2.1 JWT란?
- JSON Web Token은 사용자 인증을 위한 토큰 기반 인증 기법 중 하나.
- 토큰 자체에 사용자의 인증 정보(payload)와 서명(signature)를 담는다.
- 서버는 클라이언트가 보낸 토큰을 검증(Verify)하여 권한을 확인한다.
- 일반적으로 Access Token과 Refresh Token을 함께 사용해 만료된 토큰을 재발급한다.
2.2 JWT 구조
- Header: 토큰 타입(typ)과 해싱 알고리즘(alg) 정보가 들어감
- Payload: 사용자 정보, 권한, 만료 시간(exp) 등 실제 인증에 필요한 데이터
- Signature: Header와 Payload를 합친 문자열에 비밀키(혹은 공개/비공개 키)로 서명한 값
2.3 어디서 처리하는가?
- 서버 측(Backend): 로그인 시 인증 정보를 바탕으로 JWT를 발급하고, 해당 JWT를 검증하는 로직을 가진다.
- 클라이언트 측(Frontend): 서버로부터 받은 JWT를 저장(쿠키 혹은 브라우저 저장소)하고, API 호출 시 HTTP Header(Authorization: Bearer <token>)에 포함해서 보낸다.
2.4 JWT 검증 방식
- 서버 또는 인증 게이트웨이에서
- 토큰이 만료되었는지(exp) 확인
- 서명(Signature) 검증 (비밀키/공개키 사용)
- 권한(roles, scopes 등) 확인
- 유효하지 않은 토큰이면 요청을 거절하고, 401 Unauthorized 응답을 보낸다.
2.5 재발급(Refresh Token) 방식과 주기
- Access Token의 만료가 다가오면, Refresh Token으로 새 토큰을 발급받는다.
- 일반적인 흐름
- Access Token이 만료되기 전/후를 감지.
- Refresh Token(주로 HttpOnly Cookie나 안전한 저장소에 보관)을 이용해 재발급 API 호출.
- 서버는 Refresh Token 검증 후 새로운 Access Token(+ 필요시 Refresh Token) 발급.
- 클라이언트는 새로 발급된 토큰으로 다시 요청 수행.
2.6 다른 API 서비스 호출 시 어떻게 인증을 처리하나요?
- Microservice Architecture 등에서 다른 API 서버로 요청을 보낼 경우:
- 보통 Authorization Header에 JWT를 그대로 실어서 전달.
- 혹은 중앙 인증 게이트웨이(OAuth2 서버 등)를 통해 토큰이 유효한지 검증 후 API 호출.