위 그림에서 알 수 있듯 Authorization Code
를 사용하냐 안하냐의 차이점이 있다.
이로 인해 보안성의 차이점이 생긴다는데 왜 그럴까?
Authorization Code 타입에서 authorization code를 사용하면, 사용자의 브라우저와 클라이언트 사이에 존재하는 중간 공격자가 authorization code를 훔쳐가더라도 access token을 얻을 수 없으며 훔치기도 어렵다.
그 이유는 아래와 같다.
authorization code는 클라이언트와 인증 서버 사이에서만 사용된다.
인증 서버는 authorization code를 발급할 때, 이를 클라이언트에게 보내지만, 사용자의 브라우저는 이 코드를 읽을 수 없다. 따라서 중간 공격자가 사용자의 브라우저를 통해 authorization code를 훔치더라도, 이를 이용하여 access token을 얻을 수 없다.
authorization code는 한 번만 사용할 수 있다.
authorization code를 이용하여 access token을 발급받으면, 이 authorization code는 폐기된다. 따라서 중간 공격자가 authorization code를 훔쳐가더라도, 이미 사용된 코드이기 때문에 access token을 얻을 수 없다.
인증 서버와 클라이언트는 HTTPS를 사용하여 통신한다.
HTTPS는 데이터 전송 과정에서 암호화를 수행하여 중간 공격자가 정보를 빼낼 수 없도록 보호한다. 따라서 사용자의 브라우저와 클라이언트 사이에서 authorization code를 훔치는 공격은 불가능하다.
반면에 access token
은 위와 마찬가지로 클라이언트에게 전달되기는 하지만 중간 공격자가 이를 가로채서 훔쳐갈 수 있다.
중간자 공격(man-in-the-middle attack) 등의 방법을 통해 훔칠 수 있다.
access token은 브라우저에서 읽을 수 있다. (즉, 훔치면 써먹을 수 있다.)
authorization code를 이용하면 브라우저에서 읽을 수 없기 때문에 강탈당해도 제3자가 사용 못할 뿐더러 훔치는게 불가능하다.
하지만 authorization code를 사용 안하고 access token을 바로 주고 받으면 access token은 훔칠 수 있는 방법도 존재하고 제3자가 훔치는데 성공하면 읽을 수 있기 때문에 사용당할 수 있다.
물론 HTTPS 프로토콜을 사용하는 등의 방법으로 못훔치게하거나 Token의 만료기간을 짧게 설정해 보안이슈를 방지할 수 있다.