안녕하세요. 카카오 싱크를 이용해서 간편 로그인을 구현하려고 하고 있습니다.
시스템 설계를 하는 과정에서 어떻게 설계를 하는게 맞는 것인지 문의 드립니다.
질문 1 - 아래와 같은 구조로 설계를 하는 것이 맞는가?
- Resource owner : 고객
- User-Agent : 웹 브라우저 or 네이티브 앱 (iOS, AOS)
- Server : 자체 백엔드 서버
- Authorization Server : 카카오 인증 서버 (카카오 싱크)
질문 2 - state 생성 주체는 누구 인가?
대부분의 자료에서 client 에서 state를 생성 한다고 나와있는데요. 여기서 말하는 client가 client frontend & client backend 를 통칭하는 것인지 client frontend 를 칭하는 건지 모호해서 문의 드립니다.
질문 3 - state 검증 주체는 누구 인가?
csrf token 검증은 프론트에서 하려면 의미가 없을거 같은데 혹시 방법이 있을까요??
일단 백엔드에서 처리하는 방법을 한번 생각해 보았습니다. (실제 동작하는지는 검증이 안됐습니다.)
- 고객이 카카오 로그인 버튼을 클릭한다.
- 프론트에서 백엔드 서버로 요청을 한다.
- 요청
GET /oauth/authorization/kakao Host: localhost:8080 <- 백엔드 서버로 요청
- 응답 (이때 state를 생성하고 쿠키에 담아서 리다이렉트 응답)
HTTP/1.1 302 Found Location: https://kauth.kakao.com/oauth/authorize?client_id=1&redirect_uri=https://localhost:8080/oauth2/callback/kakao&response_type=code Set-Cookie: state=123456
- 요청
- 프론트에서 응답받은 리다이렉트 주소인
https://kauth.kakao.com/oauth/authorize?client_id=1&redirect_uri=https://localhost:8080/oauth2/callback/kakao&response_type=code
로 요청 - 카카오 로그인 팝업 출력
- 고객에 로그인
- 카카오 로그인이 완료되면 302 응답
- 응답
HTTP/1.1 302 Found Location: https://localhost:8080/oauth2/callback/kakao?code=111111&state=123456 ```
- 프론트에서 백엔드 서버로 리다이렉트 (이게 맞는지도 궁금합니다.)
- 백엔드 서버에서 query string (state) 와 쿠키 (state) 값 비교
- 통과하면 인증 토큰으로 access token 발급
- access token 으로 회원 정보 조회
- 조회된 회원 정보를 통해서 자사 고객 정보와 매핑
질문 4 - 프론트에서 state 검증을 하게 된다면 어떻게 할 수 있는가?
인터넷을 찾아보니 프론트(웹 브라우저 or 네이티브 앱)에서 authorization code를 발급 받고 백엔드에서 Access Token 을 발급 방식을 많이 설명하고 있는데 이 방식으로 할 경우 csrf 공격을 어떻게 방지하는지 궁금합니다.
감사합니다.