프로젝트 회의 준비하면서 공부한 보안 관련 내용들 블로그에 올리기.
확실히 다른 사람에게 말하려고 준비하다보니 더 열심히 찾아보고 자기자신부터 먼저 이해해보려고 노력하게 되서 좋다.
많이 부족하지만 이렇게 하나하나 익혀가는 거지. 스터디의 중요성 !!
ppt 파일로 만든 내용 블로그에 서식만 맞춰서 올리고 소스는 정리해서 깃헙 스터디 레포에 올려야겠다.
1. 인증과 인가
우선 인증과 인가 개념의 차이에 대해서 잡고 가야한다.
웹 보안은 인증과 인가를 해주어 안전하게 정보를 주고 받게 하는 것이 목표 !
인증
- 접근하는 대상이 누구인지 판단하는 것. 보통은 아이디, 패스워드를 통한 로그인으로 검증한다.
- 웹은 상태를 저장하지 않는 http 프로토콜을 사용하기에, 이를 보완하는 세션 기반, 토큰 기반 인증이 필요하다.
인가
- 인증된 접근 대상이 어디까지 권한이 있는지 정하고 그에 따라서 행동하도록 허가하는 것.
- ex) 일반 사용자는 관리자 페이지 url 을 호출하더라도 들어갈 수 없음.
👀 인증을 먼저 해주고 인가를 하는 구조로, 인증 종류에는 세션 기반 인증과 토큰 기반 인증이 있다 .
2. 세션 기반 인증
배경
- http 는 상태를 저장하지 않는 stateless 한 프로토콜이기에 매번 요청시마다 인증해야하는 번거로움이 있다. (요청 - 응답 끝나면 바로 정보 싹 날아가서 다시 요청하면 누구세요? 함)
- 쿠키 인증 방식으로 인증 정보 자체를 쿠키에 넣어 브라우저 저장하면 정보가 탈취 당할 위험이 있다.
플로우
(1) 유저가 로그인 함
(2) 서버는 세션 만들어서 서버 메모리에 저장한다. 이때 각 세션 정보를 가리키는 session id 가 부여된다.
(3) 서버는 클라이언트에게 인증됐음과 함께 session id 를 전달해준다.
(4) 브라우저에 session id 쿠키로 저장해놓고 요청시에 쿠키로 서버에 전달한다.
(5) 서버는 session id 받은걸로 저장된 세션 정보랑 비교 검증 해보고 요청을 수행해 응답한다.
장점
- 서버 측에서 사용자 상태 확인하기가 명확하다. ( 로그인 여부, 활동 여부 등 확인 명확)
- 쿠키 방식에 비해, 정보 자체는 서버에만 있기에 안전하다.
단점
- 서버에서 정보 생성, 저장해야해서 다량의 사용자 있는 경우 서버 성능에 부하 발생
- 멀티 디바이스 (모바일, 웹 동시 사용) 에서 중복 로그인 방지 등 고려해야할 게 많다.
- 서버 확장시 서버 메모리에 저장한 세션 정보의 관리가 어려워진다. (서버 메모리에 세션 정보 저장하기 때문)
3. 토큰 기반 인증
배경
- 세션 인증 방식의 단점인 서버의 부담을 줄이고, 서버 확장성을 높이는데 유용한 방식.
- 세션 id 탈취로 인한 보안 취약점을 방지하고 싶다.
알아야 할 용어
- access token : 접근한 사용자가 정상적으로 인증되고 그에 따른 권한을 확인했을 때 발급된다.
발급되면 사용자가 요청시마다 첨부해서 보내기에 탈취 가능성이 있어 만료기간이 짧다. refresh token : access token 만료되었을 때 재발급을 위해 사용하는 토큰으로 access token 보다 유효기간이 길다.
- JWT (Json Web Token) :Json 객체를 통해서 관리되는 토큰 방식. 헤더, 페이로드, 서명으로 구성되어 있다.
http header 에 담아서 서로 통신.
클라이언트에 저장하기에 서버에서 클라이언트의 토큰 조작할 수는 없다.
2편 JWT 구현하기에서 더 자세한 설명 하겠다.
플로우
(1) 유저가 로그인 함
(2) 서버는 유저 정보 확인 후 서명된 토큰을 발급한다.
(3) 클라이언트 측에서 토큰 저장해 놓고 요청시마다 토큰을 http 헤더에 함께 보냄.
(4-1) 서버는 요청과 함께 받은 토큰 검증 후 요청 수행해줌.
(4-2) 토큰 검증시 만료된 토큰이라면 재발행 여부 확인함.
👀단순한 구조로 하려면 그냥 access token 만 발급해주고 만료시마다 재인증하도록 할 수 있다. 하지만, access token 이 탈취되면 보안이 뚫려버린다.
👀이를 보완하기 위해 access token의 유효기간은 짧게 하고refresh token을 함께 쓰는 것이 더 안전하다.
3-1 Oauth 2.0
토큰 인증 방식의 한 프로토콜이다.
사용자가 다른 서비스의 기능을 아이디, 비밀번호 노출 없이도 사용할 수 있게 해준다. 이를 통해 한 서비스에서의 인증으로 다른 서비스 까지 사용할 수 있다.
Oauth 2.0 이해를 위해 알아야할 용어
- Resource Owner = User = 사용자
- Client = 이용할 서비스 (ex. 내프로젝트.com )
- Resource Server - 자원을 가지고 있는 서버 (Google, Facebook, …)
- Authorization Server - 인증 서버 (Google, Facebook의 인증 파트, …)
장점
- 서비스는 사용자의 정보를 관리해야하는 부담을 덜 수 있음.
- 사용자는 이용하려는 서비스마다 개별적으로 가입해야하는 번거로움을 줄일 수 있음.
- 권한에 따라서 인증 뿐 아니라 다른 서비스의 여러 정보에 접근 가능. (ex. 페이스북 인증 후 친구 목록 가져오기)
참고 자료
인증과 인가
Web Security: OAuth2 and OIDC – The Coders Tower
세션 인증
Session vs Cookie Authentication
Web authentication state - Session vs Cookie?
HTTP 는 Stateless 한데 로그인은 어떻게 구현할 수 있을까? (세션/쿠키를 이용한 인증)
토큰 인증
Token 인증 방식이란?
서버인증방식종류_세션/쿠키, 토큰방식 OAuth와 춤을
jwt 구현한 건 소스 좀 정리한 다음에 올려야겠다.