Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- fatal:not a git repository
- 백준
- 파이썬 map 함수
- vscode cp949
- 파이썬 |
- 코딩부트캠프후기
- 개발자스터디
- 파이썬 sep
- 주니어개발자역량강화
- 항해99
- 99일지
- 10430번
- cp949
- 파이썬 int()
- Til
- Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
- 파이썬 클래스
- 파이썬
- 항해
- MomentumParameters
- 코딩테스트
- 99클럽 #99일지 #코딩테스트 #개발자스터디 #항해 #til
- print("""
- EnvCommandError
- 항해플러스
- 개발자사이드프로젝트
- print sep
- not a git repository
- 주니어개발자멘토링
- 99클럽
Archives
- Today
- Total
선발대
[유튜브] 얄팍한 코딩사전 / 세션과 JWT 본문
세션 VS. 토큰! JWT가 뭔가요?
링크: https://www.youtube.com/watch?v=1QiOXWEbqYQ
인증과 인가의 차이점
- 인증(Authentication): 유저나 디바이스의 신원을 확인하는 것. HTTP 메시지에 누군지 적어서 서버로 요청 보냄.
- 인가(Authorization): 유저나 디바이스에게 접근 권한을 허가하거나 거부하는 것
세션 & 쿠키
- 세션: 서버 쪽에 저장하는 정보
- 쿠키: 클라이언트의 자체적인 임시저장소
- 로그인이 성공하면 세션 표딱지를 반으로 갈라서 하나는 사용자 브라우저에 세션 ID(쿠키)로 저장하고,
- 다른 한 쪽은 서버의 자기 책상, 창고 등(DB, 메모리, 하드디스크 등)에 올려놓는다.
- Stateful: 모든 사용자의 상태를 기억함. 덕분에 기억하는 대상의 상태들을 언제든 제어 가능.
- 처음 로그인 하면 서버에셔 해당 로그인 정보로 세션을 생성함.
- 그리고 클라이언트에 세션 ID를 응답으로 보냄.
- 클라이언트는 세션 ID를 쿠키 저장소에 보관함.
- 이후 클라이언트는 요청 보낼 때마다 세션 ID를 쿠키에서 꺼내서 HTTP 헤더에 넣고 전송함.
- 서버는 세션 ID를 바탕으로 저장된 세션을 탐색해 요청 보낸 유저 맞는지 확인하고 인증함.
- 장점: 세션 ID에 의미있는 정보가 없어서 HTTP 요청이 탈취되어도 ID, PW 노출되지 않음.
- 단점: 누군가 세션 ID를 헤더에 넣고 요청하면, 이게 진짜 사용자인지 확인할 길이 없음.
토큰 &JWT
- 회원가입 시 유저에 매칭되는 토큰을 생성하여 저장.
- 로그인 요청이 들어오면 해당 토큰을 응답으로 보내줌.
- 클라이언트는 토큰을 잘 가지고 있다가 요청 보낼 때 헤더에 토큰을 넣어서 보냄.
- 서버는 요청으로 들어온 토큰이 있는지 확인하고 인증해준다. (일일히 DB 뒤져서 찾아낼 필요가 없음)
- 세션&쿠키 방식과 다르게 토큰 자체에 사용자에 대한 정보가 있어서 서버는 토큰으로만 사용자 구분가능.
- Stateless: 시간이 지나도 변하지 않는 값. 통제가 되지 않으므로 유효기간을 짧게 준다.
- 일반적으로 access 토큰(실사용, 만료되면 서버로 보냄), refresh 토큰(재발급용, DB 저장) 2개 발급함.
- JWT 확인할 수 있는 사이트: https://jwt.io/
- 3가지 데이터를 이어붙인다: Header(헤더), Payload(페이로드), Verify Signature(서명)
- Header
- type: JWT (고정값임)
- alg: 알고리즘의 약자. 서명 만들 때 필요한 알고리즘을 지정함. (HS256)
- Payload
- Base64로 디코딩해보면 사용자 정보, 유효기간, 관리자 여부 등 서비스 측에서 원하는 대로 담은 정보가 담겨있음.
- 이렇게 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 함.
- 민감한 정보는 담지 않아야 함. 디코딩하면 쉽게 노출 될 수 있음. 식별하기 위한 정보만을 담아둬야 함.
- Verify Signatue
- [Header + Payload + 서버에 감춰둔 비밀값(SECRET_KEY)]을 암호화 알고리즘에 돌리면 Verify Signature이 나옴.
- 따라서 Payload의 값이 하나라도 변경되면 서명과 일치하지 않으므로 인증이 거부됨.
- 이 암호화 알고리즘은 한쪽 방향으로는 인코딩되어도 반대쪽 방향으로는 디코딩이 안됨. (시크릿키 찾아낼 수 없음)
- SECRET_KEY: 암호화에 필요한 키. settings.py에 있음. 키 노출에 조심해야 함.
- 서버와 클라이언트 사이에서 주고 받기만 하고 관리는 전적으로 서버에서만 한다.
'공부 > 유튜브' 카테고리의 다른 글
[유튜브] 생활코딩 / Docker 입문수업 (0) | 2022.07.03 |
---|---|
[유튜브] 동빈나 / 파이썬 클래스 (0) | 2021.12.22 |
[유튜브] 초보코딩 / 파이썬 클래스 (0) | 2021.12.22 |
Comments