카카오로그인 액세스토큰 리프레시토큰

안녕하세요. REST API로 카카오 로그인 연동하고 있는 학생입니다.

OAuth 2.0 개념을 처음 공부하면서 연동하고 있어서 토큰 관리하는 것에 대해서 궁금한 점이 있는데요,

액세스 토큰과 리프레시 토큰은 도대체 각각 어디에 저장해두고 써야 하는건가요? 몇시간동안 검색을 해봤는데 만족스러운 답이 나오지 않아서 결국 이렇게 여쭤봅니다. ㅠㅠ

또, 제가 찾은 답 중 가장 그럴싸 한 것은 액세스 토큰은 어차피 수명이 짧으니 쿠키에 넣어두고, 리프레시 토큰은 db에 넣어두되 그에 대한 무작위 index 값을 쿠키에 넣어놓고 쓰라는 것인데요. 이런 방식이 보안적으로 의미가 있는 조치인지, 그리고 만약 맞다면 xss나 csrf 공격은 어떻게 대비해야 하는지도 여쭤보고 싶습니다.

너무 기초적인 질문이라 부끄러운데, 제가 잡은 방향이 아예 틀렸다면 바로 잡아 주시면 감사하겠습니다. ㅠㅠ

1개의 좋아요

안녕하세요~

실제 구현 상황에 따라 다르기때문에 정답이 없을 것 같은데요.
개인적인 의견을 드리면 아래와 같습니다.

  1. 액세스 토큰을 쿠키에 넣지 않는게 좋습니다. 쿠키는 클라이언트 측에 저장되기 때문이죠.
  2. 보통 액세스 토큰은 서버 세션이나 Redis 같은 캐시 서버에 UserID와 매핑하여 한시적으로 저장합니다.
  3. 리프레시토큰을 사용해야한다면 말씀하신 것 처럼 UserID와 매핑하여 DB에 저장하고 서버측에서만 사용하시면 좋을 것 같습니다.

선생님 제가 아직도 이해가 잘 되지 않아서 질문 한번만 더 드리겠습니다.

우선 제가 이해한 바에 따르면, 카카오 로그인을 이용한 최초 회원가입 처리는
카카오 로그인 버튼 클릭 -> 크레덴셜 검증 -> 사용자 동의하고 계속 -> 연결 (인가코드 발급) -> 토큰 발급 -> 사용자 정보 받아오기 -> 데이터 생성 등 회원가입 처리

그리고 로그인 처리는
카카오 로그인 버튼 클릭 -> 크레덴셜 검증 -> 연결 (인가코드 발급) -> 토큰 발급 -> 로그인 처리

이런 흐름인 것 같습니다.

제가 궁금한 것은 아래와 같은데요

  1. 그렇다면 로그인 처리에서는 (1) 액세스 토큰을 서버 세션에 넣어두고 (2) 리프레시토큰을 DB에 저장하고 (3) 리프레시토큰을 참조할 수 있는 무작위 값을 쿠키에 넣어주면 되는 건가요?
  2. oauth를 공부하면서 토큰 기반 로그인 기능에 대한 문서들을 읽어보니 토큰 기반 인증은 서버 세션을 사용하지 않는다는 것이 특징이라고 설명하던데 만약 1번이 맞다면 이 설명과 상충되는 것 같아서요, 어떻게 이해하면 될지 대강 힌트만이라도 주시면 감사하겠습니다. 참고로 PHP 환경에서 개발중입니다.
  3. 카카오 계정 세션이라고 하는 것은 카카오 서버에서 토큰이 발급되면 자동으로 생성되는 것인가요?
    https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#request-code 에 해당 브라우저에 로그인 되어있는 카카오 계정 세션이 있다면 다른 페이지로 이동하지 않고 진행한다고 나와있어서 여쭤봅니다.

지금까지 로그인에 서버 세션만 활용하고 있었어서 쿠키와 토큰에 대한 지식이 정돈되어 있지가 않네요…
질문들이 너무 초보적이고 카카오 Api와는 다소 직접적인 관련이 없는 것들이라 죄송하고 미리 감사드립니다.

용어 정리가 먼저 필요할 것 같아요.

  • 쿠키 : 사이트 도메인 단위로 클라이언트 브라우저에 저장되는 값
  • 세션 : 서버 메모리에 저장되는 값으로 key-value 로 저장하며 세션ID값에 따라 한 사용자 단위 저장

쿠키는 서버가 브라우저에 정보를 보내어 저장하지만 클라이언트 스크립트로도 만들 수 있고, 서버 요청에 의해 서버로 전달 되기도 하지만 연관되어 있다고 안보는게 이해 하기 쉽습니다. 쿠키(클라이언트브라우저), 세션(서버메모리) 용도를 분리하면 좋습니다.

위의 용어 정리에 따라

  1. 쿠키에는 고객정보, 토큰 정보 등 보안에 관련된 어떤것도 저장하지 않는게 좋습니다.
    -> PHP(서버사이드 스크립트)에서 고객 DB나 캐시서버에 바로 저장하면됩니다.

  2. 아래 글을 참고해주세요~
    https://velog.io/@djaxornwkd12/세션-기반-인증-방식-vs-토큰-기반-인증

  3. 해당 가이드에서 표현한 "카카오 계정 세션"이라 함은 카카오 로그인 유지 여부를 의미합니다.
    소유하신 사이트에서 로그 아웃 해도,
    다시 카카오 로그인 시도 했을 때,
    카카오 측 로그인 이 유지 되어 있다면 id/pw입력 절차 없이 넘어간다는 의미입니다~

1개의 좋아요