Security
개발자들이 웹사이트, 모바일 어플, 웹 API등을 만들 때에 해커들의 공격을 막기 위해서 보안(security)은 필수 사항
공격 예시
CSRF(Cross Site Request Forgery)
다른 오리진 에서 유저가 보내는 요청을 조작하는 것
CSRF 공격조건
- 쿠키를 사용한 로그인
- 유저가 로그인 했을 때 쿠키로 어떤 유저인지 알아야 함
- 예측할 수 있는 요청/parameter를 가져야 함
- request에 해커가 모르는 정보가 있으면 안 됨
CSRF 방어법
- CSRF 토큰 사용
- 서버측에서 CSFR공격에 보호하기 위한 문자열을 유저의 브라우저와 웹 앱에만 제공
- Same-site cookie 사용
- 같은 도메인 세션/쿠키를 사용할 수 있다.(다른 도메인에서 온 쿠키는 안받음)
Token
- 클라이언트는 XSS, CSRF공격에 노출될 위험이 있어 민감한 정보를 담으면 안된다.
- 토큰은 유저 정보를 암호화한 상태로 담을 수 있고 암호화했기 때문에 클라이언트에 저장해도 된다.
Access Token, Refresh Token
우리 과제에서는 Access Token을 body에 주고
Refresh Token 쿠키에 넣어서 보내준다.
JWT(Json Web Token)
JSON 포맷으로 사용자에 대한 속성을 저장하는 웹 토큰

토큰 기반 인증 장점
- Statelessness & Scalability(무상태성 & 확장성)
- 서버는 클라이언트에 대한 정보를 저장할 필요 x
- 토큰을 헤더에 추가함으로 인증절차 완료
- 안정성
- 암호화 한 토큰을 사용
- 암호화 키를 노출 할 필요 x
- 어디서나 생성 가능
- 토큰을 생성하는 서버가 꼭 토큰을 만들지 않아도 됨
- 권한 부여에 용이
- 토큰을 payload(내용물) 안에 어떤 정보에 접근 가능한지 정의
- Ex) 사진과 연락처 사용권한 부여 / 사진 권한만 부여 / 연락처 권한만 부여
OAuth
보안된 리소스에 액세스 하기 위해 클라이언트에 권한을 제공(Authorization)하는 프로세스를 단순화하는 프로토콜 중 한 방법이다.
ex) 소셜로그인

OAuth 용어
- Resource Owner : 액세스 중인 리소스의 유저
- Client : Resource Owner를 대신하여 보호된 리소스에 액세스하는 프로그램
- Resource Server : client의 요청을 수락하고 응답할 수 있는 서버
- Authorization server : Resource Server가 액세스 토큰을 발급받는 서버
- Authorization grant : 클라이언트가 액세스 토큰을 얻을 때 사용하는 자격 증명
- Authorization code : access token을 발급받기 전에 필요한 code
- Access token : 보호된 리소스에 액세스하는 데 사용되는 credentials
- Scope : 주어진 액세스 토큰을 사용하여 액세스할 수 있는 리소스의 범위
Grant type
Grant type 종류
- Authorization Code Grant Type
- 액세스 토큰을 받아오기 위해서 먼저 Authorization Code 를 받아 액세스 토큰과 교환하는 방법
- client-secret을 공유하지 않도록 하여 보안성을 강화
- Refresh Token Grant Type
- 일정 기간 유효기간이 지나서 만료된 액세스 토큰을 편하게 다시 받아오기 위해 사용하는 방법