728x90
반응형

1. JWT에 대해 설명해주세요.

JWT(JSON Web Token)는 사용자 인증 정보를 담은 토큰입니다. 서버와 클라이언트 간 정보를 주고 받을 때 HTTP 리퀘스트 헤더에 JWT를 넣어 서버는 별도의 인증 과정 없이 헤더에 포함되어 있는 JWT 정보를 통해 인증합니다. 
일반적으로 Access token의 유효기간이 만료되면 Refresh token을 이용하여 새로운 Access token을 발급받습니다
다른 API 서비스 호출 시 인증 처리 방식은 서비스 제공자마다 다르며 일반적으로 Authorization header에 Access token을 담아서 보내거나, URL 파라미터로 Access token을 전달하는 방식 등이 있습니다.

 

🔥꼬리질문🔥

<  클라이언트의 토큰이 변경되었을 시 JWT를 사용하는 서버는 이를 어떻게 알아채나요? >

일반적으로 JWT를 사용하는 서버에서 클라이언트의 토큰이 변경되었을 때는, 서버에서는 이를 알아채지 못합니다. 
클라이언트에서 토큰이 변경되었다면, 클라이언트는 새로운 토큰을 발급받아 서버에 전달해야 합니다. 
이를 위해 클라이언트는 주기적으로 토큰을 갱신하거나, 토큰 만료 시간을 설정하여 만료되기 전에 새로운 토큰을 발급받도록 구현할 수 있습니다.

그러나 서버는 클라이언트의 토큰이 변경되었는지 여러가지 방법으로 확인할 수 있습니다. 
예를 들어, 서버는 클라이언트의 MAC 주소를 암호화하여 JWT의 Payload에 저장할 수 있습니다. 
그리고 클라이언트는 매 요청시 JWT와 함께 현재 MAC 주소를 함께 전송합니다. 
서버는 복호화한 JWT 내부의 MAC 주소와 현재 요청 온 MAC 주소를 비교하여 같은 사용자인지 검증합니다.
또 다른 방법으로는 서버가 토큰의 유효성을 public key (RS256)나 secret (HS256)을 활용하여 검증할 수 있습니다.

 

< JWT를 구현할 때 주의해야 할 점은 무엇인가요? >

Payload가 많아지면 토큰이 커져서 서버의 부담이 갈 수 있습니다. 
이를 해결하기 위해서는 Payload의 크기를 최소화하는 것이 좋습니다.

토큰이 재발급되기 전까지 사용자 정보가 갱신되더라도 적용되지 않는 문제가 있습니다. 
이를 해결하기 위해서는 토큰의 유효기간을 짧게 설정하거나 사용자 정보가 변경될 때마다 토큰을 재발급하는 것이 좋습니다.

JWT의 취약점은 토큰이 노출되면 암호화에 의미가 없어진다는 점입니다. 
따라서 JWT를 Local Storage에 저장하는 대신 쿠키에 저장하거나 서버에서 관리하는 것이 좋습니다.

 

< JWT 이외에도 사용자 인증을 위해 사용할 수 있는 다른 방법은 무엇인가요? >

세션 기반 인증: 이 방법에서는 서버가 인증된 각 사용자에 대해 세션을 생성하고 고유한 세션 식별자를 할당합니다. 
세션 식별자는 일반적으로 클라이언트의 브라우저에 쿠키로 저장됩니다. 서버는 사용자를 인증하기 위한 각 요청과 함께 세션 식별자의 유효성을 검사합니다.
토큰 기반 인증: 토큰 기반 인증은 로그인 성공 시 클라이언트에 토큰을 발급하는 것과 관련됩니다. 
토큰은 클라이언트 측(예: 로컬 저장소 또는 쿠키)에 저장하고 이후의 각 요청과 함께 보낼 수 있습니다. 서버는 토큰을 확인하여 사용자를 인증합니다.
OAuth: OAuth는 자격 증명을 공유하지 않고 타사 애플리케이션이 사용자 데이터에 액세스할 수 있도록 허용하는 데 사용되는 인증 프로토콜입니다. 
사용자는 Google, Facebook 또는 Twitter와 같은 플랫폼에서 기존 계정을 사용하여 인증할 수 있습니다.
생체 인증: 지문이나 안면 인식과 같은 생체 인증 방법은 고유한 물리적 특성을 사용하여 사용자의 신원을 확인합니다. 
이러한 방법은 일반적으로 모바일 장치에서 사용되며 추가 보안 계층을 제공할 수 있습니다.

전통적인 방법으로 ID/PASSWORD도 있습니다.

 

2. 완전탐색 알고리즘에 대해 설명해주세요.

완전 검색 알고리즘은 가능한 모든 옵션을 체계적으로 확인하여 문제에 대한 솔루션을 찾는 데 사용되는 방법입니다. 
최적의 솔루션을 찾도록 보장하는 간단하고 철저한 접근 방식이지만 계산 비용이 많이 들 수 있습니다.
따라서 일반적으로 문제 공간이 합리적인 시간과 리소스 내에서 탐색할 수 있을 만큼 충분히 작거나 
최적의 솔루션을 찾는 것이 중요하고 더 효율적인 대안이 없을 때 사용됩니다.

 

🔥꼬리질문🔥

완전탐색 알고리즘이 빠른 시간 안에 해결할 수 없는 문제도 있나요? >

완전탐색 알고리즘은 가능한 모든 경우의 수를 일일이 나열하면서 답을 찾는 방법입니다 . 
이 방식은 절대 답을 못 구하는 경우는 없으므로 나름 강력한 방법이지만,
답으로 가능한 경우의 수가 많은 경우에는 이용하기가 어려울 수 있습니다.
예를 들어, 탐색 공간의 크기가 입력 크기에 비례적으로 증가하는 경우, 
완전탐색은 지수적으로 증가하는 시간 복잡도를 가질 수 있습니다.
따라서 입력의 크기가 커지면 완전탐색은 실용적으로 해결하기 어려워집니다.
따라서 완전탐색이 최적의 선택이 아닐 수 있는 경우, 효율적인 다른 알고리즘 및 최적화 기법을 사용하여 문제를 해결하는 것이 중요합니다.

 

완전탐색 알고리즘의 최적화 방법에는 어떤 것들이 있나요? >

백트래킹 (Backtracking): 백트래킹은 재귀적으로 가능한 모든 조합을 시도하면서 불필요한 계산을 줄이는 기법입니다. 조건을 만족하지 않으면 해당 가지를 폐기하고 다음 가지로 넘어갑니다. 이는 가능한 조합의 일부를 미리 제외하여 탐색 공간을 줄이는 효과를 가집니다.
가지치기 (Pruning): 가지치기는 조건을 사용하여 앞으로 탐색해야 할 가지를 제한하는 기법입니다. 조건을 통해 비효율적인 조합이나 더 이상 유망하지 않은 가지를 탐색에서 제외할 수 있습니다. 이는 불필요한 계산을 피하고 탐색 시간을 단축시킵니다.
메모이제이션 (Memoization): 메모이제이션은 이전에 계산한 결과를 저장하여 동일한 계산을 반복하지 않고 재사용하는 기법입니다. 계산 결과를 캐시하고 필요할 때마다 재활용함으로써 중복 계산을 피하고 성능을 향상시킬 수 있습니다.
인덱스 최적화 (Indexing Optimization): 문제에 따라 인덱스를 사용하여 탐색 범위를 제한하는 최적화 방법을 적용할 수 있습니다. 인덱스를 활용하여 필요한 부분만 탐색하고 중복되는 계산을 줄일 수 있습니다.
병렬화 (Parallelization): 탐색 과정을 여러 개의 스레드나 프로세스로 분할하여 병렬적으로 처리하는 것입니다. 병렬화는 다중 코어 또는 분산 시스템에서 성능을 향상시킬 수 있습니다.
탐색 순서 최적화 (Search Order Optimization): 탐색 순서를 조정하여 더 유망한 가지를 먼저 탐색하는 것입니다. 유망한 가지를 먼저 탐색함으로써 조기에 최적해를 찾을 가능성을 높이고 불필요한 계산을 최소화할 수 있습니다.
알고리즘 변경: 완전탐색 대신 더 효율적인 알고리즘으로 문제를 해결하는 방법을 고려할 수 있습니다. 문제의 특성과 제약 사항을 분석하여 최적화된 알고리즘을 사용할 수 있습니다.

 

 

 

728x90
반응형

+ Recent posts