yyeonjju / Interview_Questions

0 stars 0 forks source link

HTTP에서의 인증/인가 | 쿠키, 세션, 토큰, JWT #21

Open yyeonjju opened 5 months ago

yyeonjju commented 5 months ago

인증 & 인가

인증

인가

인증이 누구인지 확인하는 거라면, 인가는 무엇을 할 수 있는 사용자인지 알아보는 것 → 인증 인가를 구현하는 방법에는 주로 세션(Session)방식과 토큰(Token) 방식이 있다.

왜 인증을 위해 세션(Session)과 토큰(Token)이 필요한가? 클라이언트와 서버는 데이터를 주고받기 위해 HTTP 프로토콜 방식을 범용적으로 사용하고 있기 때문에

그럼 HTTP는 뭐길래..






HTTP


HTTP이란?

Hypertext Transfer Protocol


참고 : TCP 통신에 대해서 알아보자…


image image



HTTP 동작 방법

  1. connect : 클라이언트가 원하는 서버에 접속
  2. request : 클라이언트가 이 서버에 요청.클라이언트가 서버에게 연락하는 것을 요청이라고 하며 요청을 보낼때는 요청에 대한 정보를 담아 서버로 보낸다.
  3. response : 서버가 요청에 대한 응답결과를 클라이언트에게 보내는 것을 응답이라고 한다.응답이 끝나면 서버와 클라이언트 연결 끊기(Stateless)


image







HTTP의 특징


이러한 특징의 장점이라면 불특정 다수를 대상으로 하는 서비스에 적합 계속 서버와 클라이언트의 연결상태를 유지하는 게 아니기때문에 클라이언트와 서버간의 최대 연결수보다 훨씬 많은 요청과 응답을 처리 가능


But, 어플리케이션은 상태를 유지해야 하는 서비스가 존재하는데 -> 이에 대표적인 서비스가 '로그인' -> connectionless, stateless 같은 HTTP 프로토콜의 한계를 보안하기 위해 쿠키, 세션, 토큰을 사용한다






쿠키 Cookie


쿠키를 이용하면 웹 서버와 클라이언트는 필요한 값을 공유하고 상태를 유지할 수 있습니다. ⇒ 이런 식으로 로그인이 유지되는 것


image image



쿠키 어디에 저장?



쿠키 어떤 용도로 사용?



쿠키 동작 방식

  1. 클라이언트가 페이지를 요청
  2. 서버에서 쿠키를 발급.
  3. HTTP 헤더에 쿠키를 포함 시켜 응답
  4. 최초 로그인 응답 이후 → 응답 헤더에는 Cookie 미포함, 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음.
  5. 쿠키가 존재하면 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보내서 요청
  6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 경우, 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답.





하지만 쿠키만으로 로그인을 구현하는 것은 한계가 있습니다. 쿠키는 네트워크를 통해 전달되기 때문에 중간에 쿠키를 탈취할 수 있다는 취약점이 있습니다. 개발자 도구를 켜서 바로 볼수도 있기 때문에 중요한 사용자 정보라도 저장되어 있으면 큰일. 이를 보완하고자 우리는 세션(Session) 을 사용합니다.





세션




세션의 동작 과정

  1. 사용자가 서버에 로그인 request
  2. 서버는 request가 들어오면 세션 ID를 생성하여 세션DB에 저장
  3. → response header에 포함시켜 response. ( 만들어진 sessionID는 쿠키를 통해 브라우저로 돌아오고 저장된다.)
  4. 사용자는 서버에서 해당 세션ID를 받아 쿠키에 저장을 한 후 제한된 요청에 접근할 때 마다 쿠키를 request header에 포함시켜 내보낸다.
  5. 서버에서는 쿠키를 받아 세션 저장소에서 검증한 후 요청에 해당하는 데이터를 반환한다.
image



특징, 장점/단점

https : HTTPS(Hypertext Transfer Protocol Secure)는 HTTP의 확장 버전 또는 더 안전한 버전입니다. HTTPS에서는 브라우저와 서버가 데이터를 전송하기 전에 안전하고 암호화된 연결을 설정합니다.

http, https 차이 HTTP는 암호화되지 않은 데이터를 전송합니다. 즉, 브라우저에서 전송된 정보를 제3자가 가로채고 읽을 수 있습니다. 이는 이상적인 프로세스가 아니었기 때문에, 통신에 또 다른 보안 계층을 추가하기 위해 HTTPS로 확장되었습니다. HTTPS는 HTTP 요청 및 응답을 SSL 및 TLS 기술에 결합합니다.






토큰



토큰이란?



토큰의 동작 과정

  1. 사용자가 로그인 request
  2. 서버는 request가 들어오면 사용자 검증을 통해 유효성을 확인하고 통과한다면 토큰을 response와 반환한다.
  3. 클라이언트는 토큰을 저장, 서버 요청 시 토큰을 request header에 담아 서버에 요청을 보낸다.
  4. 서버는 토큰을 검증 후, 요청에 응답.
    • 서버는 유저로부터 전달받은 토큰을 본인들이 발급한 토큰이 맞는지, 만료되지는 않았는지 등을 따져 유효성을 검사하고, 유효한 토큰인 경우 접근을 허가합니다.



토큰의 특징 / 단점






토큰 인증 방식의 단점을 보완하기 위해 토큰의 타입을 'Refresh Token'과 'Access Token'으로 나누어 사용하는 방식의 JWT 토큰을 사용하게 된다.





JWT




JWT 구조


JWT는 . 을 구분자로 나누어지는 세 가지 문자열의 조합

image



https://jwt.io/ 여기서 쉽게 JWT 토큰을 인코딩(생성) 하거나 디코딩 할수 있다.



JWT 동작 과정

  1. 처음 유저가 로그인할 때 ID, PW 를 서버에 보내는 것은 동일!

    • but, ID, PW를 보내도 ( 세션 방식에서의 세션 DB에 저장하는것처럼) 서버는 DB에 뭔가를 생성하지 않는다.
  2. 서버는 유저의 정보를 가져다가 ⭐️서버가 가진 “시크릿키”⭐️을 사용해서 signed information을 담은 token 만들어 string 형태로 보낸다

    • 이 string은 세션ID 보다 훨씬 길다. 쿠키는 공간 제약(space limit)이 있지만, JWT 는 공간 제약(space limit)이 없어서 엄청 길어도됨
  3. 이후에는 서버에 request 보낼 때 마다 token(signed information)을 보낸다.

  4. 서버가 토큰을 받으면 자신이 가진 ⭐️시크릿키로 해당 토큰의 유효성검사⭐️를한다(토큰을 조작했는지 여부)

  5. 토큰이 유효하다면, 유저 정보 파악 ( 토큰 해석해서 유저이름, 만료시기,권한 등을 파악한다)

  6. 인증 & 응답을 보낸다.


image



Access Token & Refresh Token

서버는 access token 과 refresh token 을 한번에 만들어낸다 -> refresh token만 저장소에 저장한다. ( access token은 저장하지 않음) -> access token 과 refresh token 둘 다 헤더에 담아 보내서 클라이언트가 둘 다 저장 -> access token이 만료된 후에 서버에 이걸로 요청하면 -> 서버는 만료되었다고 알려주고 -> 브라우저는 다시 access token 과 refresh token 을 둘 다 서버에 보낸다 -> 그럼 서버는 업데이트된 access token를 브라우저로 보내준다.



JWT 특징








[서버 기반(Stateful) vs 토큰 기반(Stateless)]



yyeonjju commented 4 months ago

토큰 인증 신뢰성을 가지는 이유

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

yyeonjju commented 4 months ago