redirect_uri 사용 이유
1. 해커가 로그인 버튼 즉, redirect_uri 를 변경해서 자신이 code 를 알 수 있도록 하고 사용자에게 노출시킨다. (e.g 구글 버튼이랑 동일하게 만든 거짓 사이트)
2. 구글(client site) 로그인인줄 알고 사용자는 로그인하고, 권한 승인하고 했지만 로그인은 정상적으로 되지 않는다. 코드는 해커에게 노출이 됨
3. 노출된 코드를 client site 의 redirect 로 정상적으로 보낸다. 그러면 클라이언트는 정상적으로 발급받은 것으로 확인하고 authorization server 로 코드를 보내게 된다. with client id, secret
4. 하지만 redirect uri 가 다르기 때문에 실패난다. (정상적인 redirect uri 는 http://c.com/code 라면 변조된 즉, 코드를 해커가 얻기 위한 redirect uri 는 http://c.com/hack 이기 때문에 코드 정보와 클라이언트가 토큰을 발급받기 위해 보낸 redirect uri 는 서로 다르다.)
끝
state 사용 이유
1. 위의 3번에서 코드를 client site 에서는 막 받아서 보낸다.
하지만 그것을 막기 위해서는 authorize 버튼을 클릭할 때(로그인 버튼), 저장하는 state 를 통해서 그게 정상적인 코드인지 state 로 확인한다.
만약 탈취된 code 라면 state 가 존재하지 않기 때문에 탈락.