Top

OAuth 2 in Action [OAuth 아키텍처에 대한 모든 것]

  • 원서명OAuth 2 in Action (ISBN 9781617293276)
  • 지은이저스틴 리처(Justin Richer), 안토니오 산소(Antonio Sanso)
  • 옮긴이윤우빈
  • ISBN : 9791161751450
  • 36,000원
  • 2018년 04월 17일 펴냄
  • 페이퍼백 | 484쪽 | 188*235mm
  • 시리즈 : 해킹과 보안

책 소개

소스 코드 파일은 여기에서 내려 받으실 수 있습니다.

요약

OAuth 2.0은 서비스 사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTP 기반의 보안 프로토콜이다. OAuth는 페이스북과 구글 뿐만 아니라 스타트업과 클라우드 서비스에 이르기까지 모든 곳에서 사용된다. 이 책을 통해서 OAuth 2.0의 모든 것 즉, OAuth 2.0의 개요과 구성 요소, 구성 요소 간의 상호 작용 그리고 구현 방법에 대해서 배우게 될 것이다.

추천의 글

내용이 비어 있는 페이지보다 어려운 것은 없다. 그것은 당신을 빤히 쳐다보며 조롱한다. 여러분은 무엇을 하고 싶은지 알고 있으며, 해내고 싶은 명확하고 멋진 그림을 갖고 있다. 상사나 고객이 여러분이 만들어낸 기쁨으로 황홀하게 웃음짓는 모습도 그릴 수 있을 것이다. 하지만 문제는 여러분 앞에 빈 페이지가 놓여 있다는 것이다.
그래서 도구에 손을 뻗게 된다. 이 책을 읽고 있는 사람은 개발자나 ID 관리 전문가일 가능성이 크다. 어느 쪽이든 무엇보다 보안이 중요하고 구축하고자 하는 것을 보호하길 원할 것이다.
OAuth에 대해 들어본 적이 있을 것이다. OAuth가 리소스, 특히, API를 보호하는 것과 관련이 있다는 것도 알고 있을 것이다. OAuth는 매우 인기가 많고 무엇이든 할 수 있다. 하지만 무엇이든 할 수 있는 것의 문제는 뭔가를 하기 어렵게 만든다는 것이다. 그런 것은 또 하나의 빈 페이지라고 할 수 있다.
저스틴과 안토니오가 쓴 이 책을 읽어보기 바란다. 무엇이든 할 수 있는 일을 할 때 그것이 정체되는 것을 막는 가장 쉬운 방법은 그냥 뭔가를 시작하는 것이다. 이 책은 OAuth가 무엇인지를 설명하고 있을 뿐만 아니라 OAuth 프로세스 전반에 걸쳐 무엇을 해야 하는지 알려주고 있다. 결국 OAuth를 도구로서 깊이 이해하게 되고 더 이상 여러분 앞에 빈 페이지가 놓여 있지 않게 될 것이다. 즉, 앞으로 멋진 것을 전달할 준비가 돼 있을 것이다.
OAuth는 매우 강력한 도구고, 이 강력함은 유연함에서 비롯된다. 유연함은 종종 자신이 하고 싶은 것을 할 수 있는 능력뿐만 아니라 안전하지 않은 방식으로 뭔가를 수행할 수 있는 능력을 의미한다. OAuth는 중요한 데이터에 접근할 수 있는 API에 대한 접근을 통제하기 때문에, 비정상적인 패턴을 피하고 모범적인 사례를 사용해 안전한 방법으로 OAuth를 이용하는 것이 중요하다. 다르게 말하면, 어떤 식으로든 어떤 것을 할 수 있는 유연함을 갖고 있다고 해서 반드시 그렇게 해야 하는 것은 아니다.
OAuth를 사용해야 하는 또 한 가지 이유는 API 호출들을 조정하고 그 결과 어떤 멋진 것을 할 수 있기 때문이다. 실현하고자 하는 멋진 생각을 페이지에 가득 채울 수 있다. OAuth는 그 길로 가기 위한 방법을 좀 더 안전하게 인도해준다.
감사하게도, 저자들은 해야 할 것과 하지 말아야 할 것에 대한 실용적인 가이드를 제공해주고 있다. 그들은 여러분이 “그냥 이것을 끝내고 싶다”와 “이것이 안전한지 확인하고 싶다”라는 생각을 모두 갖고 있다는 것을 알고 있다.
여러분의 머릿속과 여러분 고객의 손에 의해 가득 채워진 페이지를 위한 작업은 결국 그렇게 힘들지 않다는 것을 깨닫게 될 것이다.

이 책에서 다루는 내용

█ OAuth 2 프로토콜과 설계
█ OAuth 2를 이용한 인가
█ OpenID 커넥트와 UMA(User-Managed Access)
█ 구현에 따른 보안 위험
█ JOSE, 인트로스펙션, 폐기, 등록
█ REST API 보호화 접근

이 책의 구성

1장에서는 OAuth 2.0 프로토콜의 개요와 OAuth 이전의 API 보안과 OAuth가 만들어진 동기에 대해 설명한다.
2장에서는 OAuth 2.0의 핵심적인 그랜트 타입이면서 가장 널리 사용되는 인가 코드 그랜트 타입에 대해 자세히 다룬다.
3장부터 5장까지는 간단하지만 모든 기능을 갖춘 OAuth 2.0 클라이언트와 보호된 리소스 그리고 인가 서버를 구축하는 방법을 설명한다.
6장에서는 인가 코드가 아닌 다른 유형의 그랜트 타입과 네이티브 애플리케이션에 대해 살펴본다.
7장부터 9장까지는 OAuth 2.0 클라이언트와 보호된 리소스 그리고 인가 서버의 일반적인 보안 취약점과 그것을 피하는 방법에 대해 논의한다.
10장에서는 OAuth 2.0 Bearer 토큰과 인가 코드에 대한 공격과 보안 취약점 그리고 방지 방법에 대해 논의한다.
11장에서는 인코딩에 사용되는 JWT(JSON Web Token), JOSE 메커니즘, 토큰 인트로스펙션, 토큰 폐기에 대해 살펴본다.
12장에서는 동적 클라이언트 등록과 그것이 OAuth 2.0 생태계에 어떻게 영향을 미치는지에 대해 살펴본다.
13장에서는 OAuth 2.0이 인증 프로토콜이 아닌 이유와 OpenID 커넥트를 이용해 OAuth 기반으로 인증 프로토콜을 구축하는 방법에 대해 실펴본다.
14장에서는 OAuth 2.0 기반 위에 구축되며 사용자 간 공유를 지원하는 UMA(User Managed Access) 프로토, OpenID 커넥터, OAuth 2.0의 HEART, iGov 프로파일, 그리고 해당 프로토콜들이 특정 산업에 어떻게 적용되는지에 대해 살펴본다.
15장에서는 OAuth 2.0의 일반적인 Bearer 토큰이 아닌 PoP(Proof of Possession) 토큰과 TLS 토큰이 OAuth 2.0과 연결돼 어떻게 동작하는지에 대해 알아본다.
16장에서는 모든 것을 정리하고 이 책의 내용을 라이브러리와 더 확장된 OAuth 2.0 커뮤니티에 어떻게 적용하는지에 대해 논의한다.

저자/역자 소개

지은이의 말

현재 OAuth 2.0은 웹상에서 사용되는 최고의 인가 프로토콜이며, 모든 사람이 사용하고 있다. 규모가 큰 인터넷 기업에서부터 작은 스타트업이나 대기업에 이르기까지 많은 기업과 다양한 분야에서 사용되고 있다. OAuth 2.0을 기반으로 구축된 확장 기능과 프로파일 그리고 전체 프로토콜의 생태계가 생겨났으며, 사람들은 OAuth를 이용한 좀 더 새롭고 흥미로운 것을 모색하고 있다. 이 책의 목적은 OAuth 2.0이 무엇이고, 왜 그렇게 동작하는지를 이해시키는 것뿐만 아니라 문제를 해결하고 자체 시스템을 구축하기 위해 OAuth를 가장 잘 활용할 수 있는 방법을 제시하는 것이다.

지은이 소개

저스틴 리처(Justin Richer)

인터넷 보안과 식별, 협업, 사용성, 게임을 포함한 다양한 영역에서 17년 이상의 경력을 가진 시스템 아키텍트이자 소프트웨어 엔지니어, 표준 편집자이면서 서비스 설계자다. IETF(Internet Engineering Task Force)와 OIDF(OpenID Foundation)에서 활발히 활동하고 있으며, OAuth 2.0과 OpenID 커넥트 1.0을 포함한 기본적인 보안 프로토콜(RFC7591 & RFC7592)에 직접적으로 기여해왔고 OAuth 2.0 동적 클라이언트 등록()과 토큰 인트로스펙션(RFC7662)을 포함한 여러 개의 확장 스펙을 작성해왔다. Vectors of Trust와 NIST의 디지털 식별 가이드라인 제3판(Special Publication 800-63)에 대한 선구적인 작업은 예측할 수 없는 환경에서 신뢰할 수 있는 신원이 의미하는 것이 무엇인지에 대한 논의를 이끌어냈다. 엔터프라이즈에 초점을 맞춰 OAuth 2.0과 OpenID 커넥트를 구현한 MITREid Connect를 처음으로 오픈소스 형태로 만들어 유지 보수하고 있으며, MITRE와 MIT를 포함한 많은 단체에서 시스템 배포를 주도해왔다. 재능이 많으며 자신감 넘치는 발표자로서 기술적인 능력이 있는 청중을 대상으로 한 세계적인 컨퍼런스의 위원이나 기조 연설자로서 인기가 많다. 오픈소스와 오픈 표준의 열렬한 지지자며, 아직 솔루션이 만들어지지 않은 상태라고 하더라도 결국 올바른 솔루션이 있으면 어려운 문제를 해결할 수 있다고 믿는다.

안토니오 산소(Antonio Sanso)

스위스에 있는 어도비 연구소의 선임 소프트웨어 엔지니어로서 Adobe Experience Manager 보안 팀에 속해 있다. 그 전에는 아일랜드에 있는 IBM 더블린 소프트웨어 연구소(IBM Dublin Software Lab)에서 소프트웨어 엔지니어로 일했다. OpenSSL, 구글 크롬, 애플 사파리와 같은 유명한 소프트웨어의 보안 취약점들을 발견했으며, 구글(Google), 페이스북(Facebook), 마이크로소프트(Microsoft), 페이팔(Paypal), 깃허브(Github)의 명예의 전당에 올라 있다. 열렬한 오픈소스 기여자며 Apache Oltu의 부사장(의장) 이자 Apache Sling의 PMC 멤버다. 그는 웹 애플리케이션 보안에서부터 암호화에 이르기까지 다양한 업무를 하고 있다. 또한 12개 이상의 컴퓨터 보안 특허와 암호화 학술 논문 저자기도 하다. 그는 컴퓨터 공학 석사 학위를 갖고 있다.

옮긴이의 말

OAuth는 현재 웹 애플리케이션이나 서비스뿐만 아니라 네이티브 애플리케이션에 이르기까지 광범위하게 사용되고 있다. 사용하기 쉽고, 서비스 간의 연동과 구현을 간단히 해결할 수 있게 해주기 때문일 것이다. 이 책은 OAuth가 무엇인지를 설명할 뿐만 아니라 OAuth의 구현 방법과 구현에 있어서의 고려사항 등 OAuth와 관련된 전반적인 내용을 모두 설명하고 가이드하고 있다. 특히, OAuth 구현에 있어서 중요하게 고려해야 하는 보안적인 부분(OAuth 구현에 있어서 발생할 수 있는 일반적인 보안 취약점과 그것을 피하는 방법)에 많은 지면을 할당해 OAuth 구현에 있어서의 잠재적인 위협을 자세히 설명하고 실용적인 가이드를 제시하고 있다는 것이 특징이라고 할 수 있다.
그리고 토큰 및 동적 클라이언트 등록과 좀 더 고급 주제에 대해서도 설명하고 있다. 즉, OpenID 커네트와 JOSE/JWT, JOSE 메커니즘, 토큰 인트로스펙션, 토큰 폐기와 같은 많은 관련 기술들도 함께 설명하고 있다. 또한, OAuth 2.0이 인증 프로토콜이 아닌 이유와 OpenID 커넥트를 이용한 OAuth 기반 인증 프로토콜을 구축 방법에 대해서도 살펴보며, 사용자간 공유를 지원하는 UMA(User Managed Access) 프로토콜과, PoP(Proof of Possession) 토큰, HEART, iGov 프로파일 대해서도 살펴본다. 한마디로 OAuth 뿐만 아니라 OAuth와 관련된 모든 것을 다루고 있다고 보아도 무리는 아닐 것이다.
OAuth를 단순히 강력하고 사용하기 편한 도구로만 바라보지 말고 하나의 서비스를 구성하는 중요한 구성 요소 중 하나라고 생각한다면 그 바라보는 관점이 달라지게 돼 OAuth의 유연함과 확장성을 제대로 이용할 수 있는 계기가 될 것이다. 그 결과 OAuth가 여러분의 서비스 내부에 더 깊숙하게 녹아 들어가게 되는 계기가 되길 희망한다.

옮긴이 소개

윤우빈

기존의 IT 기술과 새로 만들어지고 있는 최신 기술을 보안이라는 관점에서 이해하고 새로운 기술, 비즈니스 영역의 새로운 보안 위협과 그에 대한 대응 기술에 대해서 고민하고 있으며, 에이콘출판사를 통해서 다양한 보안 관련 지식을 공유하고자 노력하고 있다. 지금도 여전히 새로운 분야에 대한 보안 기술 연구와 다양한 보안 기술 개발을 위해서 진땀을 흘리고 있다

목차

목차
  • 1부. 첫 번째 단계
  • 1장. OAuth 2.0이 무엇이고, 왜 관심을 가져야 할까?
    • 1.1 OAuth 2.0은 무엇인가?
    • 1.2 과거: 자격 증명 공유(그리고 자격 증명 탈취)
    • 1.3 접근 권한 위임
      • 1.3.1 HTTP Basic과 비밀번호 공유 방식을 넘어
      • 1.3.2 권한 위임: 중요성과 사용 방법
      • 1.3.3 사용자 주도 보안과 사용자 선택
    • 1.4 OAuth 2.0: 좋은 점과 나쁜 점
    • 1.5 OAuth 2.0이 아닌 것
    • 1.6 요약

  • 2장. OAuth 2.0의 기본
    • 2.1 OAuth 2.0 프로토콜의 개요: 토큰 획득과 사용
    • 2.2 OAuth 2.0 인가 그랜트
    • 2.3 OAuth의 구성원: 클라이언트, 인가 서버, 리소스 소유자 그리고 보호된 리소스
    • 2.4 OAuth의 구성 요소: 토큰, 범위 그리고 인가 그랜트
      • 2.4.1 액세스 토큰
      • 2.4.2 범위
      • 2.4.3 리프레시 토큰
      • 2.4.4 인가 그랜트
    • 2.5 OAuth의 구성원과 구성 요소 간의 상호 작용: 백 채널, 프런트 채널 그리고 엔드 포인트
      • 2.5.1 백 채널 통신
      • 2.5.2 프런트 채널 통신
    • 2.6 요약

  • 2부. OAuth 2 환경 구축

  • 3장. 간단한 OAuth 클라이언트
    • 3.1 인가 서버에 OAuth 클라이언트 등록
    • 3.2 인가 코드 그랜트 타입을 이용해 토큰 얻기
      • 3.2.1 인가 요청 보내기
      • 3.2.2 인가 요청에 대한 응답 처리
      • 3.2.3 크로스 사이트 공격을 방지하기 위한 state 파라미터 추가
    • 3.3 보호된 리소스에 접근하기 위한 토큰 사용
    • 3.4 액세스 토큰 갱신
    • 3.5 요약

  • 4장. 간단한 OAuth 리소스 서버
    • 4.1 HTTP 요청에서 OAuth 토큰 파싱
    • 4.2 액세스 토큰의 유효성 확인
    • 4.3 토큰에 기반한 콘텐츠 제공
      • 4.3.1 권한 범위에 따른 작업
      • 4.3.2 권한 범위에 따른 데이터 반환
      • 4.3.3 사용자에 따른 데이터 반환
      • 4.3.4 추가 접근 통제
    • 4.4 요약

  • 5장. 간단한 OAuth 인가 서버
    • 5.1 OAuth 클라이언트 등록 관리
    • 5.2 클라이언트 인가
      • 5.2.1 인가 엔드 포인트
      • 5.2.2 클라이언트 인가
    • 5.3 토큰 발급
      • 5.3.1 클라이언트 인증
      • 5.3.2 인가 그랜트 요청 처리
    • 5.4 리프레시 토큰 지원
    • 5.5 권한 범위 지원
    • 5.6 요약

  • 6장. 현실 세계의 OAuth 2.0
    • 6.1 인가 그랜트 타입
      • 6.1.1 암시적 그랜트 타입
      • 6.1.2 클라이언트 자격 증명 그랜트 타입
      • 6.1.3 리소스 소유자 자격 증명 그랜트 타입
      • 6.1.4 어설션 그랜트 타입
      • 6.1.5 올바른 그랜트 타입 선택
    • 6.2 클라이언트 배포
      • 6.2.1 웹 애플리케이션
      • 6.2.2 웹 브라우저 애플리케이션
      • 6.2.3 네이티브 애플리케이션
      • 6.2.4 클라이언트 시크릿 관리
    • 6.3 요약

  • 3부. OAuth 2.0 구현과 보안 취약점

  • 7장. 일반적인 클라이언트 보안 취약점
    • 7.1 일반적인 클라이언트 보안
    • 7.2 클라이언트에 대한 CSRF 공격
    • 7.3 클라이언트 자격 증명 탈취
    • 7.4 리다이렉트 URI 등록
      • 7.4.1 레퍼러를 통한 인가 코드 탈취
      • 7.4.2 오픈 리다이렉터를 통한 토큰 탈취
    • 7.5 인가 코드 탈취
    • 7.6 토큰 탈취
    • 7.7 네이티브 애플리케이션 모범 사례
    • 7.8 요약

  • 8장. 일반적인 보호된 리소스 보안 취약점
    • 8.1 보호된 리소스의 보안 취약점
    • 8.2 보호된 리소스의 엔드 포인트 설계
      • 8.2.1 리소스 엔드 포인트를 보호하는 방법
      • 8.2.2 암시적 그랜트 지원 추가
    • 8.3 토큰 재전송
    • 8.4 요약

  • 9장. 일반적인 인가 서버 보안 취약점
    • 9.1 일반적인 보안
    • 9.2 세션 가로채기
    • 9.3 리다이렉트 URI 조작
    • 9.4 클라이언트 가장 impersonation
    • 9.5 픈 리다이렉터
    • 9.6 요약

  • 10장. 일반적인 OAuth 토큰 보안 취약점
    • 10.1 Bearer 토큰
    • 10.2 Bearer 토큰 사용에 있어서의 위험과 고려 사항
    • 10.3 토큰 보호 방법
      • 10.3.1 클라이언트에서 탈취
      • 10.3.2 인가 서버에서 탈취
      • 10.3.3 보호된 리소스에서 탈취
    • 10.4 인가 코드
      • 10.4.1 Proof Key for Code Exchange(PKCE)
    • 10.5 요약

  • 4부. OAuth에 대한 더 많은 것

  • 11장. OAuth 토큰
    • 11.1 OAuth 토큰이 무엇인가?
    • 11.2 구조화된 토큰: JSON Web Token
      • 11.2.1 JWT의 구조
      • 11.2.2 JWT 클레임
      • 11.2.3 서버에서의 JWT 구현
    • 11.3 암호화를 통한 토큰 보호: JOSE
      • 11.3.1 HS256를 이용한 대칭 시그니처
      • 11.3.2 RS256을 이용한 비대칭 시그니처
      • 11.3.3 다른 토큰 보호 방법
    • 11.4 온라인으로 토큰의 정보를 조회: 토큰 인트로스펙션
      • 11.4.1 인트로스펙션 프로토콜
      • 11.4.2 인트로스펙션 엔드 포인트
      • 11.4.3 인트로스펙션 토큰
      • 11.4.4 인트로스펙션과 JWT의 결합
    • 11.5 토큰 폐기로 토큰의 라이프사이클 관리
      • 11.5.1 토큰 폐기 프로토콜
      • 11.5.2 폐기 엔드 포인트 구현
      • 11.5.3 토큰 폐기
    • 11.6 OAuth 토큰 라이프사이클
    • 11.7 요약

  • 12장. 클라이언트 동적 등록
    • 12.1 서버가 클라이언트를 식별하는 방법
    • 12.2 실시간으로 클라이언트 등록
      • 12.2.1 동작 방식
      • 12.2.2 왜 동적 등록을 사용하는가?
      • 12.2.3 등록 엔드 포인트의 구현
      • 12.2.4 클라이언트 등록
  • 12.3 클라이언트 메타 데이터
    • 12.3.1 핵심적인 클라이언트 메타 데이터 필드 이름 테이블
    • 12.3.2 사람이 읽을 수 있는 클라이언트 메타 데이터의 국제화
    • 12.3.3 소프트웨어 명세서
  • 12.4 동적으로 등록된 클라이언트의 관리
    • 12.4.1 관리 프로토콜의 동작 방식
    • 12.4.2 동적 클라이언트 등록 관리 API 구현
  • 12.5 요약

  • 13장. OAuth 2.0에서의 사용자 인증
    • 13.1 OAuth 2.0이 인증 프로토콜이 아닌 이유
      • 13.1.1 인증 vs. 인가
    • 13.2 OAuth를 인증 프로토콜로 매핑
    • 13.3 OAuth 2.0 인증 방법
    • 13.4 인증을 위해 OAuth 2.0을 사용하는 데 있어서의 일반적인 함정
      • 13.4.1 인증의 증거로서의 액세스 토큰
      • 13.4.2 인증의 증거로서의 보호된 API에 대한 접근
      • 13.4.3 액세스 토큰 삽입 3
      • 13.4.4 수신자 제한의 결여
      • 13.4.5 잘못된 사용자 정보 삽입
      • 13.4.6 식별 제공자마다 다른 프로토콜 사용
    • 13.5 OpenID 커넥트: OAuth 2.0 기반의 인증과 식별 표준
      • 13.5.1 ID 토큰
      • 13.5.2 UserInfo 엔드 포인트
      • 13.5.3 동적 서버 발견과 클라이언트 등록
      • 13.5.4 OAuth 2.0과의 호환성
      • 13.5.5 고급 기능
    • 13.6 간단한 OpenID 커넥트 시스템 구축
      • 13.6.1 ID 토큰 생성
      • 13.6.2 UserInfo 엔드 포인트
      • 13.6.3 ID 토큰 파싱
      • 13.6.4 UserInfo 가져오기
    • 13.7 요약

  • 14장. OAuth 2.0을 이용하는 프로토콜과 프로파일
    • 14.1 UMA
      • 14.1.1 UMA가 중요한 이유
      • 14.1.2 UMA 프로토콜의 동작 방식
    • 14.2 HEART
      • 14.2.1 HEART가 중요한 이유
      • 14.2.2 HEART 스펙
      • 14.2.3 역학적인 HEART 프로파일
      • 14.2.4 의미론적 HEART 프로파일
    • 14.3 iGov
      • 14.3.1 iGov가 중요한 이유
      • 14.3.2 iGov의 미래
    • 14.4 요약

  • 15장. 그 외 토큰들
    • 15.1 왜 Bearer 이외의 토큰이 필요할까?
    • 15.2 PoPProof of Possession 토큰
      • 15.2.1 PoP 토큰 요청과 발급
      • 15.2.2 보호된 리소스에 대한 PoP 토큰의 사용
      • 15.2.3 PoP 토큰 검증
    • 15.3 PoP 토큰 지원을 위한 구현
      • 15.3.1 토큰과 키 발급
      • 15.3.2 서명된 헤더 생성과 전달
      • 15.3.3 헤더 파싱, 토큰 인트로스펙션, 시그니처 검증
    • 15.4 TLS 토큰 바인딩
    • 15.5 요약

  • 16장. 요약과 결론
    • 16.1 올바른 도구
    • 16.2 주요 의사 결정
    • 16.3 더 큰 생태계
    • 16.4 커뮤니티
    • 16.5 미래
    • 16.6 요약

  • 부록 A. 이 책에서 사용하는 코드 프레임워크
    • A.1 코드 프레임워크 소개

  • 도서 오류 신고

    도서 오류 신고

    에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

    오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

    (예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

    정오표

    정오표

    [p.66 : 2행]
    인가 코드(authorization coe)
    ->
    인가 코드(authorization code)

    [p.209 : 8행]
    그대로 유지되기 때문에 최종 방문페이지를
    ->
    그대로 유지되기 때문에 최종 방문페이지는

    [p.369 : '13.5.2 UserInfo 엔드 포인트' 1행]
    OpenDI
    ->
    OpenID