240524
오늘의 학습
● 1. HTTP 상태 유지 방법
● 2. JWT( JSON Web Token )
HTTP 상태 유지 방법
인증과 인가
1. 인증 ( Authentication )
인증은 해당 유저가 실제 유저인지 인증하는 개념이다.
스마트폰에 지문인식, 사이트에 로그인 등과 같이 실제 그 유저가 맞는지를 확인하는 절차
즉, 로그인 정보에 대한 유효성 체크이다.
( 로그인시 유효성 체크 )
2. 인가 ( Authorization )
인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념이다.
예를들면 일반 유저가 관리자 페이지에 접근을 할 때 접근이 불가능하게 처리해주고
관리자가 관리자 페이지에 접근할 때 접근이 가능하도록 허가를 해주는 개념이다.
( 회원 및 비회원 접근 권한 )
HTTP 프로토콜의 통신은 비연결성 무상태로 이루어진다
1. 비연결성 ( Connectionless )
서버와 클라이언트가 연결되어 있지 않다는 의미이고 이 말은 클라이언트가 서버에 요청을 보내게 되면
서버는 요청에 대한 응답을 보내주고 연결을 끊어버린다는 의미이다.
2. 무상태( Stateless )
무상태는 서버가 클라이언트의 상태를 저장하지 않는다는 것이다.
클라이언트가 서버에게 요청과 응답을 주고 받는 과정에서 전에 보낸 요청에 대한 정보를 서버가 저장하지 않는다는
의미이다. 이유는 리소스의 비용과 부담을 증가시키기 때문에 저장하지 않는다.
HTTP 프로토콜 웹 통신에서 상태를 유지하는 방법 ( 즉, 로그인을 유지시키는 방법 )
1. 쿠키와 세션 방식의 인증
- 사용자가 로그인 정보를 넣고 로그인을 한다.
- 서버가 로그인에 대한 정보를 받고 회원DB에 조회를 해서 검증을 한다.
- 로그인이 되었다는 정보를 회원정보세션 생성을 통해 세션 저장소에 넣어두고
- 사용자의 세션 ID를 세션저장소에서 만들어 발급을 해준다.
- 로그인 성공 응답과 함께 세션ID를 주게된다.
- 브라우저에서 세션ID를 브라우내에 쿠키 저장소에 보관을 하고 재요청 시 쿠키안에 세션ID를 서버로 보낸다. ( 주로 HTTP Header에 담아서 보내게 된다. )
- 재요청에 대한 정보 중 세션ID를 통해 세션저장소에서 쿠키를 재검증을 즉, 세션저장소에 들어있는 값과 비교를 한다.
- 유저 정보 세션이 검증이 되었다면 세션 정보를 주게 된다.
- 정보를 받고 로그인에 따른 요청에 대한 응답을 보내게 된다.
2. JWT( JSON Web Token ) 방식의 기반 인증
인증에 필요한 정보들을 암호화시킨 토큰을 의미한다.
JWT 기반 인증은 쿠키와 세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어서 서버가
클라이언트를 식별하게 되는 방식이다.
- 사용자가 로그인에 대한 정보를 들고 서버에 요청을 보내게 된다.
- 서버는 로그인 정보를 가지고 회원DB에 조회를 통해 검증을 한다.
- 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 유저의 정보를 JWT로 암호화 해서 내보냅니다.
- 서버는 로그인 요청의 응답으로 jwt 토큰을 내어줍니다.
- 클라이언트는 그 토큰을 저장소에 보관하고 앞으로의 요청마다 토큰을 같이 보냅니다.
- 클라이언트의 요청에서 토큰을 발견했다면 서버는 토큰을 검증합니다.
- 이후에는 로그인 된 유저에 따른 응답을 내어줍니다.
정리
로그인을 하고 DB에서 검증 후 성공하면 로그인 정보를 가지고 JWS(JSON Web Token)을 이용하여 Token 발급 후
응답을 보내고 사용자는 Token을 브라우저 쿠키 저장소에 저장을 해두고 있게 되고 재요청 시 Token과 함께 요청을
넘기고 서버는 검증을 하고 응답을 보내는 방식이다.
* JWT는 쿠키 세션 방식과 다르게 토큰을 저장할 필요가 없고 검증만 하면 되어서 서버에 부담이 없다는 장점이 있다.
JWT(JSON Web Token)
JWT란 무엇인가?
JWT(JSON Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim기반의 Web Token 입니다.
즉, 토큰의 한 종류라고 생각하면 된다. 일반적으로 쿠키 저장소를 사용하여 JWT를 저장한다.
1. JWT 사용 흐름
1. 클라이언트가 로그인을 하여 요청을 했을 경우
- 클라이언트가 아이디와 비밀번호로 로그인 성공 시 서버에서 로그인 정보를 JWT로 암호화(Secret Key사용)를 한다. ( 정보가 많을수록 암호화의 길이가 길어질 우려가 있다. )
- 서버에서 직접 쿠키를 생성해 JWT를 담아 클라이언트 응답에 전달을 해준다. ( JWT 전달 방법은 개발자가 정한다. ) ( 응답 형태는 주로 res.addCookie(cookie); => 응답 Header에 JWT(토큰)을 전달하게 된다. )
2. 클라이언트에서 JWT를 통해 인증하는 방법
- 클라이언트에서 넘어온 Request데이터를 통해 데이터에 포함되어있는 Cookie를 찾아야 한다. 이때 쿠키에 담긴 정보가 여러 개일 수 있기 때문에 그 중 이름이 JWT가 담긴 쿠키의 이름과 동일한지를 찾아서 JWT를 가지고와야한다.
- 클라이언트가 전달한 JWT 위조 여부 검증 ( Secret Key 사용 )
- JWT 유효기간이 지나지 않았는지 검증
- 검증에 성공 시 JWT에서 사용자의 정보를 가지고 올 수 있고 사용자의 정보를 통해 요청에 대한 응답을 주면 된다.
# 오늘의 회고
오늘은 JWT의 토큰 방식의 암호화를 배웠고 JPA의 관계에 대해서 조금 더 알게 되었다.
강의 진도를 나가면서 Enum에 대한 부족함을 느끼게 되어서 앞으로는 Enum 공부를 병행 할 예정이다!
우선 순위로는 강의 진도를 목표로 두고 시간이 남으면 개인적으로 프로젝트를 열심히 해야겠다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 29일차 TIL - ExceptionHandler (0) | 2024.05.28 |
---|---|
내일배움캠프 28일차 TIL - Filter (0) | 2024.05.27 |
내일배움캠프 26일차 TIL - JPA핵심 및 관계, 3계층 분리 (0) | 2024.05.23 |
내일배움캠프 25일차 TIL - 외래키 (1) | 2024.05.22 |
내일배움캠프 24일차 TIL - Generic Static Method (0) | 2024.05.21 |