예를들어 안드로이드 todo list앱을 만들고 todo 서버도 만드는 상황. OAuth2서버는 구글을 쓴다고 가정.
이해한 순서:
1. 앱이 google oauth2 로그인 페이지로 이동시킴
여기서 redirect_url을 loopback으로 설정해서 auth code를 앱이 받을 수 있도록 함
2. 앱이 auth code를 받으면 이거로 구글서버에 토큰 요청함
이러면 refresh_token과 access_token, 그리고 jwt토큰인 id_token을 얻는거같음
3. 앱이 jwt토큰인 id_token을 header에 담아서 todo서버로 여러 요청을 보냄
4. todo서버가 jwt토큰 유효성 검사하고 email등을 이용해서 사용자를 구분.
이렇게 하려고 했는데 여기서 질문
1번 질문: 2번 과정에서 토큰 요청할때 스니핑을 해서 auth code를 탈취할 수 있는 위험이 있는거 아님??
2번 질문: 이 과정이 맞다면 궁금한거. refresh_token도 만료기간을 설정하던데 이러먼 사용자는 수시로 로그인을 해야하는거 아닌가? 영구적인 로그인을 구현하고싶은데? 그렇다고 refresh_token의 만료기간을 없애는건 또 보안문제라고 하는거같음
도대체 어떤 흐름으로 구현해야하는게 맞는건가요? 단지 서버에 접속하는 클라이언트가 누군지 구벌하고싶은건데 자꾸 헷갈려요
- dc official App
당연히 수시로 갱신 받아야지.. 사용자가 장기간 미사용이면 로그인이 풀리는게 맞는거지
장기간 미사용이면 로그인이 풀릴 수 있는거는 이해하는데 주기적으로 사용하더라도 refresh_token이 만료되면 로그인 다시해야하는거 아니에요? - dc App
2번째 과정에서 id token도 받아온다는 부분은 구글 문서에 없는데 어디서 본거임?
google oauth2 playground에서 어떤 응답이 오는지 보면서 확인했던건데 조금이따가 다시 찾아서 와볼게요 - dc App
문서보기랑 친하지 않아서 그런지 몰라도 id_token관련한 내용을
https://cloud.google.com/docs/authentication/token-types?hl=ko
여기서밖에 찾지 못하겠네요.
https://developers.google.com/oauthplayground/
여기서 로그인 테스트할때는 id_token이 같이 오던데 oauth2표준인지도 사실 잘 모르겠어요
https://www.oauth.com/oauth2-servers/signing-in-with-google/getting-an-id-token/
여기서
관련 정보를 찾기는 했네요
1번 질문에서 걱정하는 대로 탈취 위험이 있다고 생각함. 그래서 나는 구글에 토큰을 넘기고 access token이랑 refresh token 받아서 핸들링 하는 부분은 서버에서 하고, 앱에서는 서버에서 새로 발급한 jwt를 쓰고있음
2번 질문에서 물어보는 영구적?로그인은 뭔 소린지 잘 모르겠음. 한 1년 후에 접속해도 접속 유지 시킨다는 이야기임?
refresh_token에 만료기간이 있으면 사용자가 계속 접속했더라도 만료될 때마다 로그인 다시해줘야하지 않은가 싶어서요 - dc App
구글의 refresh toke 이 만료되면 그 토큰으로 구글 기능(프로필같은거)을 못쓰는 것 뿐임. 님이 워하면 1년 2년 넘어서도 로그인 하게 할 수 있음. 그게 보안이 좋은지는 다른 얘기임
근데 todo server가 사용자를 식별하기위해 사용하는 값은 token이 아니라 token을 이용해 구글로부터 받은 email같은 값이어야 할거같은데(왜냐면 token들은 갱신이 가능하니까 고유 식별자로 못쓸거같았음) 구글 기능을 못쓰는 토큰이면 의미가 없어진 토큰 아니에요? - dc App
그래서 내가 2번에서 자체 식별용토큰을 쓴다는 거임. 이메일 같은거 써도 되고
그러면 최초 로그인할 때 받은 access_token을 가지고 구글 유저 정보중에 식별자로 쓸만한거(또는 식별자로 쓸만한게 담긴거(2번 과정에서 받은 jwt토큰)) 한번 찾으면 앱에서 그걸 저장하고 세션처럼 사용하면 된다는건가요? token들은 구글 정보 가져올때나 필요할테니까?