인증 : 식별가능한 정보로 서비스에 등록된 유저의 신원을 입증하는 과정
인가 : 인증된 사용자에 대한 자원 접근 권한 확인(권한에 대한 허가)
ex) 웹에 적용
유저가 게시판 글을 쓰고 싶어한다.
회원 가입과 로그인을 한다. -> 인증(로그인 하는 과정)
글을 쓸 수 있는 권한을 획득한다. -> 인가
다른 사람의 글도 읽을 수 있다. -> 인가
다른 사람의 글을 수정할 수 없다. 왜냐하면 그 권한은 없기 때문이다. ->인가가 적용 된 개념
인증과 인가
(우테코 강의라든가, 아니면 루터회관 14층 혹은 글을 쓰는 기능이나 글을 삭제하는 기능과 같은) 자원들을 적절하거나 유효한 (우테코 멤버나 혹은 일반사용자나 관리자 같은) 사용자에게 전달, 공개하기 위한 방법
인증
1. 인증하기 (Request Header)
2. 인증 유지하기 (Browser)
3. 안전하게 인증하기 (Server)
4. 효율적으로 인증하가 (Token)
5. 다른 채널을 통해 인증하기 (Oauth)
[10분 테코톡] 🤠루피의 인증과 인가 정리
클라이언트 <-- HTTP 통신 --> 서버
무상태성 : 서버는 클라이언트가 보낸 요청과 다음 요청에 대한 연관 관계가 없다 라고 생각하고 요청을 받고 처리 한다.
무상태성으로 인해 사용자는 서버에 요청할마다 매번 로그인이 필요하다.
-> 이 문제를 해결하기 위해 브라우저에 있는 storage 사용한다.(로컬스토리지, 세션스토리지, 쿠키)
-> 쿠키에 사용자 아이디와 비밀번호를 넣고 인증이 필요한 요청을 할 때 같이 보내면 DB 체킹이 돼서 원하는 자원을 받을 수 있어서 사용자 입장에서 편리하다.
그리고 스토리지에 사용자의 정보가 노출되어 있어서 해커 입장에서도 편리한 방법이다.
또한 클라이언트는 서버보다 상대적으로 보안에 취약하다는 단점이 있다.
이 두 가지 단점을 해결하기 위해서 Session을 도입
세션은 인증된 사용자의 식별자와 랜덤한 문자열로 세션 ID 를 만들어서 응답헤더에 넘겨 주고 클라이언트가 저장할 수 있도록 만든다. 이 방법의 장점은 클라이언트가 사용자의 raw한 데이터를 가지고 있지 않아서 해커가 정보를 가지고 가더라도 크게는 위험하지 않다. 그리고 세션의 만료기간을 정할 수 있어서 만료기간을 정한다면 해커가 가져가더라도 유효하지않다 라는 장점이 될 수 있다. 또한 탈취 된 세션을 서버에서 삭제하면 세션 자체를 이용하지 못 하게 되어 보안상의 이점이 있다.
서버를 여러개 두는 경우 로드밸런서를 두게 되는데 이때 문제가 발생한다.
사용자가 인증 요청할때 처음 서버가 아닌 다른 서버로 요청이 가게 되면 그 서버에는 세션이 없어서 문제가 발생한다.
서버 하나하나 자체에서 세션을 관리하고 있어서 생긴 문제이다.
이 문제는 세션스토리지를(서버들에 있는 모든 세션들을 한 곳에서 관리) 둬서 해결한다.
로드밸런서가 요청을 해도 결국에는 한 곳으로 요청을 하기 때문에 문제가 해결된다.
하지만 또 문제가 발생한다.
클라이언트가 많아질 경우 많은 요청이 세션스토리지에 가기 때문에 터질수 있다.
이 문제를 해결하기 위해 요청과 응답안에 사용자의 상태를 담아본다.
이것으로만 사용자의 인증과 인가를 처리하는 것이 바로 토큰을 활용한 인증과 인가 방법이다.
JWT
시크릿 키를 사용해서 JWT 생성 -> 시크릿 키를 사용해서 JWT의 인증 과정을 거친다.
JWT 자체는 해독하기가 무척 쉬워서 민감한 정보를 담지 않는다. 비밀번호 같은..
그리고 이 시크릿 키가 중요한 만큼 노출되면은 JWT 토큰 자체도 끝이 나게되어 시크릿 키를 서버 내부에 잘 관리를 해야 된다.
로드밸런서가 쏘는 것을 각자 자기가 가진 시크릿 키로 해독을 해서 인증을 진행하고 요청을 반환하면 된다 라는 장점이 있다.
단점은 해킹을 당할 수 있다. 액세스토큰이 탈취 당하면 해커는 사용자와 똑같은 지위를 가지게 된다.
이를 막기 위해서 우리는 만료 기한을 정하는데 사용자가 불편하게 된다.
그래서 나온 개념이 리프레시토큰이라는 개념이다.
사용자가 로그인 요청을 보내면 요청을 따라서 시크릿키를 통해서 토큰을 만들어내는데 이 때 서버가 만든 토큰은 액세스토큰과 리프레시토큰을 한 번에 만든다. 액세스토큰은 저장하지 않고 리프레시토큰만 따로 저장소에 저장한다. 그 다음에 이 둘을 한 번에 응답헤더로 보내서 클라이언트가 둘 다 저장을 한다. 그 다음에 액세스토큰을 사용해서 클라이언트가 요청을 보내면 된다. 만료된 엑세스 토큰을 보내게 되면 서버는 "너 만료 됐어"라고 얘기를 하는데, 그때 이제 브라우저에서 자동으로 액세스토큰과 리프레시 토큰을 함께 다시 서버로 보내게 되고, 서버는 돌아온 리프레시토큰을 참고해서 DB를 찔러서 이게 맞다면 새로 갱신한 액세스토큰을 보내게 된다. 그러면 클라이언트에서도 업데이트 된 액세스 토큰을 사용할 수 있게 된다.
핵심!
토큰으로 상태 관리를 하기에 따로 세션을 둘 필요가 없다 라는 게 토큰방식의 장점
효율성이 좋아지고 DB를 찔러도 되지 않기 때문에 속도가 빠르다는 장점
하지만 토큰도 관리 해야 되는 대상이 되기 때문에 보안에 있어서 신경은 꾸준히 써야 한다.
참고
https://www.youtube.com/watch?v=y0xMXlOAfss&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC
'개발 관련 강의 정리 > 10분 테코톡' 카테고리의 다른 글
[10분 테코톡] 👨💻히브리의 Sharding, Clustering, Replication 정리 (0) | 2023.05.01 |
---|---|
[10분 테코톡] 🐶 코기의 Servlet vs Spring (0) | 2023.04.28 |
[10분 테코톡] 🐬히로의 웹 요청과 응답 정리 (0) | 2023.04.27 |
[10분 테코톡] 🦊닉의 Spring vs Spring Boot 정리 (0) | 2023.04.25 |
[10분 테코톡] 🧀 제리의 MVC 패턴 정리 (0) | 2023.04.24 |
댓글