점심먹기 전에 심심해서 디시식으로 정리해 봄 틀린거 지적좀




1. 세션기반인증법 (session-based authentication)


클라이언트(프론트엔드)하고 서버(백엔드)간 통신에서 서버는 클라이언트가 누구인지 실제로 클라이언트가 주장하는 누군가가 맞는지 확인하기 위해 아이디랑 패스워드를 묻는 로그인 기능을 구현해야됨. 근데 클라이언트가 서버 한테 뭔가 요청 할 때마다 항상 서버는 클라이언트가 누군지 확인해야됨. 기존에 사용되는게 '세션기반인증'


step 1. 유저가 클라를 통해 서버에 아이디와 패스워드를 보냄.

step 2. 서버는 유저 아이디와 패스워드 정보를 확인하고, 유저가 인증 됬다는 사실을(즉, 세션) 서버에 기록하고 브라우저 쿠키에 세션 아이디를 심음

step 3. 클라가 서버에 요청을 할때마다 세션아이디가 함께 보내짐. 서버는 클라가 보낸 세션 아이디와 서버가 전에 저장해 둔 세션이랑 비교해서 해당 유저가 맞는지 확인.


세션기반인증 이란 단어가 좇같은게, 세션이라는 단어 자체는 인증절차에 국한되서 쓰여지는 것도 아니고 후술할 토큰도 세션 그 자체인데 괜히 이름때문에 "다른 인증 방식에는 세션이 없나?" 이런 오해를 뉴비들한테 불러 일으킬 뿐만 아니라 개발자들끼리 대화할때도 지금 말하는 세션이 그냥 세션인지 '세션기반인증'을 말하는 건지 헷갈리게 만듬 특히나 프갤 같은 곳은 대화 중간에 끼어들거나 해서 누가 뭘 말하는지 더 헷갈림. 이름을 바꾸자면 '세션을 서버에 저장하는 방식의 인증법'




2. 토큰 기반 인증


세션기반인증의 문제점은 서버에 세션을 저장해야된다는 그 사실 자체임. 유저 수가 늘어날 때마다 서버에 저장해야될게 늘어난다는 건 둘째 치고, 일단 뭔가 서버에 저장해야될 민감한 정보가 늘어난 것 자체부터가 기업입장에서는 부담임. 흔히 쓰는 stateless한 REST 아키텍쳐와도 안맞음. 그래서 만들어진게 토큰 기반 인증


step 1. 유저가 서버에 아이디와 패스워드를 보냄

step 2. 서버는 유저 정보를 확인하고 임시 신분증(즉, 토큰)을 발급해서 클라이언트에 줌. 클라이언트는 토큰을 어딘가에 저장해둠.

step 3. 클라가 서버에 요청할 때마다 토큰을 서버에 줌. 서버는 토큰이 사실인지 확인하고 유저가 맞는지 확인.


서버에 아무것도 저장할 필요가 없고, 서버는 편의점 알바가 담배팔때 신분증 검사하는 것 마냥 토큰을 검사 하기만 하면됨. 결정적으로 세션리스트를 참조할 필요가 없기 때문에 토큰 방식 자체에는 수평적 확장(horizontal scaling)에 대한 제약이 없다. 또한 쿠키가 아니니까 브라우저를 안써도 편히 사용가능. 대신 서버가 세션을 직접 관리하지 않기 때문에 '모든 기기에서 로그아웃' 같은 몇몇 세션 관리 기능을 완벽히 구현하기에 까다롭다.




2.1 JWT는?


JWT는 인증 방식의 종류가 아니라 한 토큰 형식의 이름임.





3. OAUTH 2.0


OAUTH는 일단 기본적으로 인증(authentication) 프로토콜이 아니라 허가(authorization) 프로토콜이다.

서버A가 서버B에 있는 유저의 정보를 사용할 수있게 유저가 서버A에게 "허가" 해주는 방법의 표준임. 예를들어 게임서버(서버A)가 유저의 프로필 사진 같은 걸 구글(서버B)에서 받아오고 싶을때 유저가 '그래 내 구글 정보 써라' 라고 "허가" 해주는 것.


근데 서버A 입장에서는, 서버B가 유저정보를 제대로 주는 걸로 봐서 서버B가 유저를 대신 "인증"했다고도 볼 수 있지 않을까?

Oauth의 개념을 좀만 뒤집어서 생각하면 인가가 아니라 인증 용도로 쓸 수 있는데, 그것을 다듬은게 OIDC




4. OpenIDC (OIDC)


야 "토큰 인증 방식"에서 굳이 신분증(토큰)을 우리가 발급 안해도 되지 않냐? OAUTH 2.0기반으로 조금만 바꾸면 인증 용도로 쓰겠는데?


해서 나온 표준이 oidc임. 우리나라 신분증도 신분증을 발급하는 정부기관(=토큰 발급기관, 구글 같은데)이랑 신분증을 검사하는 편돌이(=토큰 확인기관)가 독립된 기관인것과 원리가 같음. 편돌이(=토큰 확인기관)가 정부(=토큰 발급기관)와 정부가 발급한 신분증(=토큰)을 신용하기 때문에 가능한 방법. 실제 어떻게 작동하는지 쓰고 싶은데 점심시간이 다 되서 중략함. 인터넷에 찾아보면 존나게 널렸을것 같아서 용어의 관계 정리만 하면 충분하겠지?


OAUTH에서 말하는 허가(Authorization)과 OIDC에서 말하는 인증(Authentication)의 결정적인 차이는

- 허가: 유저가 서버에 허가를 내리는 것

- 인증: 서버가 유저를 인증하는 것