[OAuth 2.0/OIDC] nonce, state

API 서버 인증을 OAuth로 처리하려고 서버를 구현하고 있는데, 다른 서비스들 보니까 요청시 nonce와 state라는게 보입니다. 예를 들자면 트위치가 쓰네요.

State는 RFC6749에 서술되어 있습니다.

Once authorization has been obtained from the end-user, the authorization server redirects the end-user's user-agent back to the client with the required binding value contained in the "state" parameter. The binding value enables the client to verify the validity of the request by matching the binding value to the user-agent's authenticated state

최종 사용자로부터 권한이 넘어오면 인증 서버는 "state" 매개변수에 필요한 바인딩 값을 사용해 최종 사용자의 에이전트를 다시 클라이언트로 리디렉션 합니다. 바인딩 한 값은 클라이언트가 바인딩 값을 사용자 에이전트의 인증 된 상태와 같게 해 요청의 유효성을 검증할 수 있게 합니다.

아마도 CSRF 공격을 막기 위해 쓰는 것 같습니다. 트위치에서 code 받아보니 URI 쿼리로 같이 날아옵니다. 이게 같은지 검증하고 나서 쓰면 될 것 같네요.

Nonce는 OpenID Connect (OIDC) 표준입니다. OpenID 1.0 명세를 보면 이렇게 서술되어 있습니다.

String value used to associate a Client session with an ID Token, and to mitigate replay attacks. The value is passed through unmodified from the Authentication Request to the ID Token. If present in the ID Token, Clients MUST verify that the nonce Claim Value is equal to the value of the nonce parameter sent in the Authentication Request. If present in the Authentication Request, Authorization Servers MUST include a nonce Claim in the ID Token with the Claim Value being the nonce value sent in the Authentication Request. Authorization Servers SHOULD perform no other processing on nonce values used. The nonce value is a case sensitive string.

클라이언트의 세션을 ID 토큰에 연결하여 재생 공격을 완화하는 데 사용하는 문자열 변수입니다. 이 값은 요청에서 ID토큰으로 수정 없이 전달됩니다. ID 토큰에 존재할 경우, 클라이언트는 반드시 nonce 클레임 값이 인증 요청에서 전송 된 nonce 매개 변수의 값과 동일한지 확인해야합니다. 인증 서버는 nonce 값에 다른 처리를 하지 않는게 좋습니다. nonce 값은 대소문자 구분하는 문자열입니다.