인증과 인가
인증과 인가란?
인증이란?
(식별가능한 정보로) 서비스에 등록된 유저의 신원을 입증하는 과정
인가란?
인증된 사용자에 대한 자원 접근 권환 확인
정리
자원을 적절한/유효한 사용자에게 전달/공개 하기 위한 방법
1.인증하기(Request Header)
2.인증 유지하기(Browser)
3. 안전하게 인증하기(Server)
4.효율적으로 인증하기(Token)
5. 다른 채널을 통해 인증하기(OAuth)
사전지식
클라이언트/서버
HTTP통신 - 무상태성(Stateless)
1. Request Header 활용하기
http://user:1q2w3e!@http://www.cocktailpick.com/login
user:1q2w3e! 이부분을 파싱 인코더합니다. 이부분을 요청헤더에 넣어서 서버로 보냅니다. db에서 체크하고 로그인을 해줍니다.
Request Header만 활용할 시 문제점
개인정보가 담긴 URL, 서버부하가중, 매번 인증해야 합니다.
2. Browser 활용하기
이를 해결하기 위하여 Browser 스토리지에 담습니다.
인증이 필요한 서비스를 요청할때 Cookie에 아이디, 비번을 담아 서버에게 요청합니다. 그러면 체크되서 서비스를 받을수 있습니다
이건 해커에게도 좋습니다. 스토리지에 정보들이 노출되어 있으니 언제든지 가져갈 수 있기 때문입니다.
3. Session 활용하기
이를 해결하기 위해서 서버의 도움을 요청받습니다.
먼저 로그인 요청을 보내 DB에서 확인하고, 원하는 자원을 바로 보내주지 않고
세션을 도입합니다. 세션아이디를 응답의 헤더로 넘겨주고, 클라이언트가 저장할 수 있게 합니다. 이를 통해 사용자측에서 로우한 데이터를 가지고 있지 않기 때문에 정보를 가져가더라도 크게 위험하지 않습니다. Session에 만료기간을 정하므로 가져가도 유효하지 않다.
-문제점
서버가 많아져서 로드밸런서로 서버에 접근하게 된다면, 다른 서버로 이동시 세션아이디에 접근할 수 없습니다. 문제점은 서버가 세션아이디를 다루고 있기 때문에 일어났습니다.
-세션 DB
이를 해결하기 위해 세션아이디를 DB에 저장한다. 얘도 문제가 있다. 클라이언트가 많아지는경우 요청이 많아지면 감당하지 못한다.
Stateful
클라이언트, 서버, 세션저장소 상태를 관리할 수 있게 했더니 문제가 생겼습니다. HTTP의 무상태성과 인증을 통해 상태를 유지하려는 패러다임의 충돌이 있습니다.
Stateless
클라이언트와 서버에게 말고 흐름에게 맡겨보자. 요청과 응답안에 사용자의 상태를 나타내는 것이 Token입니다.
JWT
이중 하나가 JSON WEB TOKEN입니다. JWT
시크릿키로 JWT를 만들어 냅니다. 시크릿키로 JWT의 인증과정을 거칩니다. JWT는 해독하기 쉬워 민감한 정보는 담지 않습니다. 그리고 시크릿키를 서버내부에서 잘 관리해야 합니다.
JWT 활용하기
맨처음은 로그인을하고 요청을 보냅니다. 원래라면 세션스토리지와 연결이 되어있는데, 그렇지 않고 시크릿키를 이용해서 Token을 만들어냅니다. 헤더에다 담아서, 이제 이키를 이용해 응답을 보내고 요청을 받습니다.
이 토큰이 클라이언트로부터 서버로 넘어갔습니다. 서버는 토큰의 유효성 검사를 서버가 가지고 있는 시크릿키로 진행합니다. 유효하다면 사용자 정보를 파악 합니다. 이름, 토큰 만료시기, 권한을 파악합니다. 비밀번호는 담으면 안됩니다.
JWT 활용하기-장점
서버가 여러대 있는데 서버 각자 가진 시크릿키로 토큰을 해석하여 인증을 진행하면 됩니다. 요청을 진행하면 됩니다. 확장성과 연결이 되어 서버가 많아져도 해독이 가능합니다.
토큰 활용하기 - 문제점
해킹을 당할 수 있습니다. 엑세스 토큰을 탈취당하면 사용자와 똑같은 지위를 가지게 됩니다.
토큰 활용하기 - 만료기한
만료기한 30분을 설정하면 해커도 사용못하고 사용자도 사용을 못하게 됩니다.
토큰 활용하기 - Refresh Token
맨 처음 로그인 요청을 보냅니다. 그러면 로그인 요청을 따라서 시크릿키를 통해서 토큰을 만들게 되는데, 서버는 엑세스 토큰과 리프레쉬 토큰을 한번에 만들게 됩니다. 엑세스 토큰은 저장하지 않고 리프레쉬 토큰은 저장하게 됩니다. 그 다음에 이 두개를 응답의 헤더로 보냅니다. 클라이언트가 두개다 저장합니다. 서버에는 엑세스 토큰은 없어지게 됩니다. 그리고 클라이언트는 엑세스 토큰을 통해서 요청을 보내게 됩니다. 엑세스 토큰이 기한이 만료된다면, 클라이언트는 리프레쉬 토큰과 엑세스 토큰을 서버에게 보내, 서버는 리프레쉬 토큰을 확인하고, 갱신된 엑세스 토큰을 다시 클라이언트에게 보내줍니다.
토큰 활용하기 - 핵심
토큰으로 상태관리를 하기에 따로 세션을 둘 필요가 없다.
토큰 관리를 해야한다. 결국 토큰도 탈취당할 수 있습니다.
다른 서비스를 통해 인증 받기 (Outh)
생활코딩, 테코톡
마치며- 복습
출입증은 인증, 출입증안에 귀한분은 인가입니다.
유저의 상태를 어디에 책임을 물리느냐?
유저가 직접 타이핑을 한다-->클라이언트--->서버--->토큰
마치며 - 더 알아보려면
보안!!
JWT, OAUTH, 인증 서버를 둔다, HTTPONLY, Sliding Session, Refresh Token
SSL/TLS