즉, 프론트에서 사용자가 누구인지 알 만한 단서를 서버에 보내주면, 서버는 그 단서를 파악하여 각 요청에 맞는 데이터를 반환하게 된다.
현재 모바일, 웹 서비스에서 가장 많이 쓰이는 통신 방식
HTTP 메시지란?
⇒ 서버에 요청(Request)을 보내는 것
모바일/웹서비스의 인증 : 보통 HTTP 메시지의 헤더에 인증수단을 넣어 요청(Request) 보냄
= 모바일/웹의 인증을 책임지는 대표주자
1.처럼 계정 정보를 매번 요청에 넣어 보내기엔 보안에 큰 단점이 있다. 이를 보완하기 위해 나온 방식이다.
세션 : 서버에서 가지고 있는 정보
쿠키 : 사용자에게 발급된 세션을 열기 위한 열쇠(Session ID)
쿠키만으로 인증을 사용한다 = 서버의 자원은 사용하지 않는다는 의미이다. 즉, 클라이언트가 인증 정보를 모두 책임지게 된다는 것이다. 이는 1.의 방식처럼 보안이 취약하다.
👉🏻 따라서 쿠키만 사용하는 방식은 장바구니, 자동 로그인 설정 등(보안과 거리가 먼 기능)에서 유용하게 쓰인다!
결과적으로, 세션을 사용하는 이유는 인증의 책임을 서버가 지게 하기 위함이다. (아무래도 클라이언트단보단 서버가 해킹당하기 훨씬 어렵기 때문!)
따라서 세션/쿠키 방식의 인증은
으로 진행된다.
모바일/웹의 인증을 책임지는 또 다른 대표주자
JSON 객체를 사용해 정보를 안정성 있게 전달하는 웹 표준
사용자는 Access Token(JWT 토큰)을 HTTP 헤더에 실어 서버로 보냄
JSON Web Token
= 인증에 필요한 정보들을 암호화시킨 토큰
📌 토큰
= Encoded Header
+ .
+ Encoded Payload
+ .
+ Verify Signature
Header
: 암호화할 방식(alg), 타입(type) 등Payload
: 서버에 보낼 데이터. (ex: 유저의 고유 ID값, 유효기간 등)Verify Signature
: Base64방식으로 인코딩한 Header, payload 그리고 SECERT KEY를 더한 후 서명됨❓ 토큰은 전체가 다 암호화되어 있나요?
👉🏻 NO!
Header
,Payload
: 인코딩될 뿐(16진수로 변경), 따로 암호화되지 않음 ⇒ JWT 토큰에서 Header, Payload는 누구나 디코딩하여 확인 가능.Verify Signature
: Secret KEY를 알지 못하면 복호화할 수 없음 (즉, 다른 사용자가 Payload의 ID를 조작하여 보내도, Verify Signature가 일치하지 않기에 유효하지 않은 토큰으로 간주됨)
💡 쿠키/세션 방식과 가장 큰 차이
- 세션/쿠키 : 세션 저장소에 유저의 정보를 넣음
- JWT : 토큰 안에 유저의 정보를 넣음
물론 이는 클라이언트 입장에서는 HTTP 헤더에 세션 ID/토큰을 실어 보내는 것으로 유사하지만, 서버 입장에서는 인증을 위해 암호화를 할 것인가 / 별도의 저장소를 이용할 것인가로 차이가 있다.
간편함 : 세션/쿠키와 달리 별도의 저장소가 필요하지 않음
Stateless한 서버를 만들기 적합 : JWT는 발급 후 검증만 하면 됨
* Stateless : 어떠한 별도의 저장소도 사용하지 않는, 즉 상태를 저장하지 않는 것 ⇒ 서버 확장/유지,보수에 유리함
뛰어난 확장성 : 토큰 기반으로 하는 다른 인증 시스템에 접근 가능
중앙의 인증 서버, 데이터 스토어에 대한 의존성 없음
Base64 URL Sage Encoding ➡ URL, Cookie, Header 모두 사용 가능
이미 발급된 JWT에 대해서는 돌이킬 수 없음
세션/쿠키의 경우, 만일 쿠키가 악의적으로 이용될 시 해당 세션을 삭제해버리면 된다. 하지만 JWT는 한 번 발급되면 유효기간 만료까지는 계속 사용이 가능하다.
👉🏻 해결책 : 기존 Access Token의 유효기간을 짧게 하고, Refresh Token이라는 새로운 토큰을 발급한다.
제한적인 Payload 정보
Payload는 따로 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없음
긴 JWT의 길이 → 서버 자원 낭비 발생
세션/쿠키 방식에 비해 길이가 김 → 인증이 필요한 요청이 많아질수록 서버의 자원 낭비 발생
Payload의 정보가 많아지면 네트워크의 사용량 증가
데이터 설계 고려 필요
토큰이 클라이언트에 저장, 서버에서 클라이언트의 토큰을 조작할 수 없음