[TIL/Nest] 2024/09/25

원민관·2024년 9월 25일
0

[TIL]

목록 보기
159/159
post-thumbnail

✅ Kakao Auth 2.0 Flow Based on NestJS (up to refetch)

1. GET /oauth/authorize (Client -> Kakao)

사용자의 Kakao 계정으로 인증을 요청한다. 이 단계에서 클라이언트는 Kakao의 인증 서버에 client_id, redirect_uri 등의 정보를 포함하여 요청을 보낸다.

2. 302 redirect (Kakao -> auth.controller.ts)

사용자가 Kakao 로그인 페이지에서 인증을 완료하면, Kakao는 설정된 redirect_uri로 302 리다이렉트를 수행한다. 요청에는 인가 코드가 포함되어 있다. 인가 코드는 이후 토큰 요청에 사용된다.

3. POST /oauth/token (auth.controller.ts -> Kakao)

클라이언트는 받은 인가 코드를 사용하여 Kakao의 토큰 엔드포인트에 POST 요청을 보낸다. 해당 요청에는 grant_type, client_id, client_secret, code, redirect_uri 등의 정보가 포함된다. Kakao는 유효한 인가 코드에 대한 액세스 토큰과 리프레시 토큰을 반환한다.

4. Profile 정보 (Kakao -> auth.controller.ts)

Kakao로부터 받은 액세스 토큰을 사용하여, 클라이언트는 Kakao API를 호출하여 사용자 프로필 정보를 요청한다. 이 단계에서는 사용자의 이메일, 이름 등 필요한 정보를 가져온다.

5. JWT 토큰 받기 (auth.controller.ts -> auth.service.ts)

프로필 정보를 성공적으로 가져온 후, auth.controller.ts는 이 정보를 사용하여 JWT 토큰을 생성하기 위해 auth.service.ts의 login 메서드를 호출한다.

6. 유저 조회 (auth.service.ts -> MongoDB(User table))

auth.service.ts에서 Kakao 프로필 정보를 사용하여 데이터베이스에서 사용자를 조회한다. 이 단계에서는 사용자가 이미 존재하는지 확인하게 된다.

7. 유저 반환 (MongoDB(User table) -> auth.service.ts)

데이터베이스에서 사용자가 발견되면, 해당 사용자 정보를 auth.service.ts로 반환한다.

8. accessToken 생성 (auth.service.ts)

사용자가 확인되면, auth.service.ts에서 JWT 액세스 토큰을 생성한다. 이 토큰은 클라이언트가 API를 호출할 때 사용된다.

9. refreshToken 생성 (auth.service.ts)

사용자의 세션을 관리하기 위해, 리프레시 토큰도 생성한다. 리프레시 토큰은 액세스 토큰이 만료된 후에도 사용자를 인증할 수 있도록 해준다.

10. refreshToken 해시, user 테이블 저장 (auth.service.ts -> MongoDB(User table))

생성된 리프레시 토큰을 안전하게 저장하기 위해 해시 처리를 수행한 후, 해당 토큰을 사용자의 데이터베이스 레코드에 저장한다. 이를 통해 보안을 강화할 수 있다.

11. accessToken, refreshToken 발급 (auth.service.ts -> auth.controller.ts)

액세스 토큰과 리프레시 토큰을 생성한 후, auth.service.ts는 이를 auth.controller.ts로 반환한다.

12. Set-Cookie: accessToken, refreshToken (auth.controller.ts -> client)

클라이언트는 HTTP 응답으로 두 개의 쿠키를 설정한다. 하나는 액세스 토큰, 다른 하나는 리프레시 토큰이다. 이 쿠키는 이후 요청에 사용된다.

13. 만료된 accessToken으로 요청 (client -> auth.controller.ts)

클라이언트는 API 엔드포인트에 요청을 보낸다. 만약 액세스 토큰이 만료된 경우, 이 요청은 실패한 것으로 간주된다.

14. 401 Unauthorized (auth.controller.ts -> client)

액세스 토큰이 만료되었음을 확인한 서버는 클라이언트에게 401 unauthorized 응답을 반환한다. 이때 클라이언트는 리프레시 토큰을 사용하여 새로운 액세스 토큰을 요청할 수 있다.

profile
Write a little every day, without hope, without despair ✍️

0개의 댓글