본문 바로가기

항해99/프로젝트

[항해99] 최종 프로젝트 예상 질문

로그인, 토큰 관련 예상질문

로그인의 흐름

  1. 로그인 흐름은 다음과 같이 이루어집니다:
  2. 사용자가 네이버 또는 카카오 소셜 로그인을 시도합니다.
  3. 클라이언트 애플리케이션은 해당 소셜 플랫폼에서 인가 코드를 받습니다.
  4. 애플리케이션은 받은 인가 코드를 서버로 전송합니다.
  5. 서버는 전달받은 인가 코드를 사용하여 소셜 플랫폼의 액세스 토큰을 요청합니다.
  6. 받은 액세스 토큰을 사용하여 사용자 정보를 소셜 플랫폼의 API에 요청합니다.
  7. 받은 사용자 정보를 이용하여 데이터베이스에 해당 사용자를 등록하거나 가져옵니다.
  8. 사용자에게 로그인 완료 메시지 및 필요한 인증 토큰(주로 JWT)을 전송합니다.
  9. 이후에는 애플리케이션은 해당 사용자의 요청에 대해 유저 정보를 확인하고, 필요한 권한을 확인하여 요청을 처리합니다.

← 레디스 →

Q. Redis는 무엇이며, Spring Boot에서 왜 사용하나요?

A. Redis는 인메모리 데이터 구조 저장소로, 데이터베이스, 캐시 및 메시지 브로커로 사용됩니다. Spring Boot 애플리케이션에서 Redis는 자주 액세스되는 데이터를 저장하고 관리하거나 데이터베이스 쿼리 또는 결과를 캐싱하고 효율적으로 세션 관리를 처리하는 데 사용될 수 있습니다.

 

Q. RedisConfig 클래스의 목적은 무엇인가요?

A. RedisConfig 클래스는 Redis 연결 팩토리 및 Redis 템플릿을 구성하는 Spring 구성 클래스로, Redis 서버에 대한 연결을 설정합니다.(데이터의 직렬화 및 역직렬화를 구성함)

 

- 직렬화(Serialization)

1. 직렬화는 데이터를 바이트(byte) 형태로 변환하여 저장하는 과정입니다.

2. Redis에서는 직렬화된 데이터를 저장하기 위해 사용됩니다.

3. 주로 객체나 데이터 구조를 바이트 배열로 변환하여 저장합니다.

4. Redis는 여러 가지 직렬화 방식을 지원하며, 대표적으로는 JSON 등이 있습니다.

5. 직렬화 방식을 사용하여 데이터를 Redis에 저장하면, 응용 프로그램에서 데이터 구조를 보존하면서 Redis에 저장할 수 있습니다.

 

- 역직렬화(Deserialization)

1.역직렬화는 저장된 직렬화된 데이터를 다시 원래의 형태로 변환하는 과정입니다.

2. Redis에서 데이터를 읽어올 때 사용됩니다.

3. 직렬화된 바이트 배열을 다시 객체나 데이터 구조로 변환하여 응용 프로그램에서 사용할 수 있도록 합니다.

4. 저장된 데이터를 응용 프로그램에서 사용하기 위해서는 Redis로부터 읽어온 직렬화된 데이터를 역직렬화하여 응용 프로그램에서 사용할 수 있는 형태로 변환해야 합니다.

 

Q. RedisConfig 클래스에서 LettuceConnectionFactory의 역할을 설명해주세요.

A. LettuceConnectionFactory는 Redis 서버에 대한 연결을 생성하는 역할을 합니다.

RedisConfig 클래스에서는 RedisProperties 빈에서 가져온 호스트와 포트 정보를 사용하여 연결 팩토리를 초기화합니다.

 

Q.Spring Data Redis의 RedisTemplate의 목적은 무엇인가요?

A. RedisTemplate은 Redis 작업을 단순화하기 위해 Redis에 데이터를 저장, 검색, 삭제 및 제어하는 메서드를 제공합니다.

 

Q. RedisConfig에서 두 가지 다른 RedisTemplate 빈이 구성된 이유는 무엇인가요?

A. 두 가지 다른 RedisTemplate 빈은 다른 유형의 데이터를 처리하기 위해 구성됩니다.

하나는 일반 키-값 쌍을 위해 StringRedisSerializer로 구성되고, 다른 하나는 Jackson2JsonRedisSerializer를 사용하여 특정 RefreshToken 객체를 Redis에 저장하고 검색하기 위해 작성되었습니다.

 

Q. RedisService 클래스의 목적은 무엇인가요?

A. RedisService 클래스는 Redis와 상호작용하기 위한 메서드를 제공합니다.

애플리케이션의 다른 부분이 Redis 기능을 편리하게 사용할 수 있는 인터페이스를 제공합니다.

 

Q. RedisService에서 RedisRefreshTokenRepository의 의미는 무엇인가요?

A. RedisRefreshTokenRepository는 RedisRefreshToken 엔티티에 대한 CRUD 작업을 수행하기 위한 Redis의 저장소 인터페이스입니다.

 

Q.  Redis는 데이터 만료를 어떻게 처리하며, 이것은 왜 유용한가요?

A. Redis는 키에 만료 시간을 설정할 수 있으며, 이후에 자동으로 만료되어 데이터베이스에서 삭제됩니다. 데이터베이스에 오래된 데이터가 축적되지 않도록 할 수 있습니다

 

← 토큰관련 →

Q. 토큰 기반 인증이란 무엇인가요?

A. 토큰 기반 인증은 사용자가 로그인할 때 서버로부터 발급받은 토큰을 사용하여 인증하는 방식입니다.

이 토큰은 클라이언트에 저장되며, 서버에서는 이 토큰을 검증하여 사용자를 인증합니다.

 

Q. JWT(Json Web Token)는 어떤 구조로 이루어져 있나요? → 이건 잘 모르겠습니다

A. JWT는 세 부분으로 이루어져 있습니다.

헤더(Header), 페이로드(Payload), 서명(Signature)으로 구성되며, 각 부분은 Base64로 인코딩되어 있습니다.

헤더는 토큰의 타입과 사용된 해싱 알고리즘을 정의합니다.

페이로드는 클레임(Claim)으로 구성되어 있으며, 토큰에 포함될 정보를 담고 있습니다.

서명은 헤더와 페이로드, 시크릿 키를 사용하여 생성되며, 토큰의 유효성을 검증하는 데 사용됩니다.

 

Q. JWT의 장단점은 무엇인가요?

A. JWT의 장점은 간결하고 자가 수용적인 구조를 가지고 있어 서버 상태를 저장할 필요가 없으며, 분산 환경에서 유용하게 사용될 수 있다는 점입니다.

또한, 클라이언트와 서버 간의 상태를 저장하지 않기 때문에 확장성이 좋고, 쿠키보다 안전합니다. 단점은 토큰이 클라이언트에 저장되어 있기 때문에 토큰을 탈취당하면 보안에 취약할 수 있습니다.

 

Q. JWT 토큰이 만료되었을 때 어떻게 처리해야 하나요?

A. JWT 토큰이 만료되었을 때는 클라이언트에서 새로운 토큰을 요청해야 합니다.

일반적으로 만료된 액세스 토큰과 리프레시 토큰이 함께 발급되어 있고, 이 리프레시 토큰을 사용하여 새로운 액세스 토큰을 발급받을 수 있습니다.

 

Q. 소셜 로그인의 장점은 무엇인가요?

A. 소셜 로그인의 장점은 사용자가 따로 회원가입을 하지 않고도 소셜 플랫폼의 계정을 사용하여 간편하게 로그인할 수 있다는 점입니다.

또한, 보안에 더 안전한 인증을 제공할 수 있으며, 사용자의 정보를 가져와서 개인화된 서비스를 제공할 수 있습니다.

 

Q. 소셜 로그인을 구현할 때 주의해야 할 보안적인 측면은 무엇인가요?

A. 소셜 로그인을 구현할 때는 사용자의 개인 정보를 안전하게 처리해야 합니다.

OAuth 프로토콜을 통해 안전하게 사용자의 인증 정보를 전송하고, 사용자의 동의를 얻어야 합니다.

또한, 클라이언트와 서버 간의 통신을 안전하게 보호해야 하며, CSRF(Cross-Site Request Forgery)공격을 방어할 수 있는 적절한 대책을 마련해야 합니다.

 

Q. JWT 토큰을 사용할 때 발생할 수 있는 보안적인 취약점은 무엇인가요?

A. JWT 토큰을 안전하게 사용하기 위해서는 토큰의 유효성을 검증하는 과정이 필요합니다.

서명을 검증할 때, 키를 안전하게 보호하고, 올바른 알고리즘을 사용해야 합니다.

또한, 페이로드에 민감한 정보를 포함시키지 않고 필요한 정보만 포함시켜야 합니다.

토큰의 만료 시간을 적절히 설정하여 토큰이 탈취되더라도 유효 시간이 짧아서 피해를 최소화할 수 있습니다.

 

Q. kakaoLogin 메서드 역할

A. 카카오 소셜 로그인을 처리하는 메서드입니다.

카카오 인가 코드를 받아와서, 이를 이용하여 액세스 토큰을 요청하고, 이를 통해 카카오 사용자 정보를 가져옵니다.

카카오 사용자 정보를 이용하여, 해당 사용자가 이미 회원으로 등록되어 있는지 확인하고, 회원이 아니라면 신규로 등록합니다.

 

Q. 액세스 토큰 획득 및 사용자 정보 가져오기

A. getToken 메서드를 통해 카카오 소셜 로그인에 필요한 인가 코드를 사용하여 액세스 토큰을 발급받습니다.

getKakaoUserInfo 메서드를 통해 액세스 토큰을 이용하여 카카오 API를 호출하고, 사용자의 카카오 정보를 가져옵니다.

 

Q. 회원 등록 또는 정보 업데이트

A. 가져온 카카오 사용자 정보를 이용하여, 해당 사용자가 이미 회원으로 등록되어 있는지를 확인합니다.

만약 이미 회원으로 등록된 사용자라면, 해당 회원의 정보를 업데이트하고, 카카오 ID를 추가합니다.

그렇지 않은 경우, 새로운 회원으로 등록합니다. 비밀번호는 랜덤 UUID를 생성하여 설정하고, 카카오에서 제공하는 이메일 정보를 이용하여 회원 정보를 생성합니다.

 

Q. JWT 토큰 발급 및 리프레시 토큰 관리

A. 회원 등록 또는 정보 업데이트가 완료되면, 해당 회원에 대한 JWT 액세스 토큰과 리프레시 토큰을 생성합니다.

JWTUtil 클래스를 사용하여 액세스 토큰과 리프레시 토큰을 생성하고, 이를 클라이언트에게 반환합니다.

리프레시 토큰은 RefreshTokenService를 사용하여 생성하고 DB에 저장합니다.

 

반환 값:

회원 로그인이 성공했을 때, MemberResponseDto 객체를 생성하여 사용자 이름, 액세스 토큰, 리프레시 토큰을 반환합니다.