스프링부트 시큐리티 5강 - 시큐리티 권한처리
https://www.youtube.com/watch?v=uaEuT7ZfQI8&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=6
25, 26행에서 권한에 따른 접근 허용한다.
글로벌하게 걸고 싶으면 저렇게 걸면 된다.
밑에 주소 매핑마다 어노테이션으로 거는 방법도 있음.
8,9행에서 테스트를 위해 role 컬럼을
ROLE_USER에서
ROLE_MANAGER로 변경
ROLE_ADMIN으로 변경
13행
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
//secured 어노테이션 활성화, preAuthorize, postAuthorize 어노테이션 활성화
하나만 걸고 싶으면 70행 처럼
여러개 걸고 싶으면 76행처럼
[5] jsp에 권한 제한 하기
- 사용
페이지에서 F12(개발자모드) 혹은 소스코드보기를 통해 코드를 감추고 싶을 때 taglib를 이용해 권한을 제한할 수 있다.
[1] 일단 태그라이브러리를 추가한다.
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
[2] 가리고 싶은 코드를 <sec:authorize access="hasRole('ROLE_ADMIN')" >로 감싸준다.
소스코드 보기로 확인
스프링부트 시큐리티 12강 - JWT를 이해하기전 세션에 대해 알아보자
https://www.youtube.com/watch?v=cv6syIv-8eo&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=13
로그인 관리를 세션으로 할때 동접자가 300명 등 많아지면
클라이언트에서 서버를 하나만 두는게 아니라 여러개 두게 되는데
이런걸 로드 밸런싱이라 한다.
서버가 여러개가 됐으니 1번 서버에 처음 세션 등록이 됐다 치면
2번 서버로 접속 될때는 세션 기록이 없다는 문제가 생길 수 있다.
이걸 방지하기 위해
1)
1번 서버에서 얻은 세션을 나머지 서버에도 복제를 한다.
2)
처음 오는 유저는 1번 서버로만 접속하게 한다..?
쨋든 1,2 번 다 설정이 필요한 번거로운 작업이다.
3) DB에 세션을 저장한다.
이건 속도가 느린 문제가 있다.
서버에 저장하면 RAM에서 관리하기 때문에 빨리 조회할 수 있는데
DB에 하면 HDD(하드디스크)에 저장되므로 이건 RAM에 저장할때보다 현저히 느려진다.
이런 문제점들을 보완하기 위해 JWT를 쓴다고 볼 수 있다.
스프링부트 시큐리티 13강 - JWT를 이해하기전 TCP에 대해서 알아보자
https://www.youtube.com/watch?v=0PCxZ_mIaAo&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=14
웹에는 OSI 7계층이란게 있다.
포괄적으로 알아보자.
OSI 7계층 이걸 알아야 TCP에 대해 알게 되고
TCP에 대해 알게돼야 보안에 대해 알게되고
보안에 대해 알게돼야 JWT 필요성에 대해 알게된다.
응용계층
프리젠테이션 계층
세션계층
트랜스포트 계층
네트워크 계층
데이터링크 계층
물리 계층
위와 같은 과정을 거쳐 상대방한테 정보가 전달된다.
메일이든, 롤에서 캐릭이 궁을 쓰든
응용계층 : 비밀번호, 사진 100장
프리젠테이션 계층 : 암호화 , 압축
세션계층 : 인증체크, 상대방 컴퓨터 켜져있는지?, 내가 접근할 수 있는지?
트랜스포트 계층 : TCP/ UDP통신할지 (웹은 TCP 통신 한다는걸 꼭 기억하자)
네트워크 계층 : IP (집 위치 찾고)
데이터링크 계층 : LAN ( 집 안에 공유기 4개 중 목표로 하는 특정 공유기 찾아줌)
*LAN : 근거리 통신 (공유기 내부 통신)
*WAN : 원거리 통신
물리 계층 : 광 케이블
*TCP통신
: A가 B의 응답을 보며 데이터 보냄.
신뢰성 있음.
속도 느림
*UDP통신
: A가 B의 응답을 기다리지 않고 무자비하게 데이터 보냄.
반가워라는 데이터가 중요하지 않으니 그냥 무자비하게 보냄.
신뢰성 없음.
속도 빠름.
전화할때 UDP통신 쓴다.
동영상도 UDP, TCP 다 된다.
그런데 비밀번호는 어떨까? 비밀번호는 UDP로 할 수 없다.
웹은 TCP 통신을 한다.
롤도 TCP 아니면 버그발생
스프링부트 시큐리티 14강 - JWT를 이해하기전 CIA에 대해서 알아보자
https://www.youtube.com/watch?v=d9huoyT_Z5g&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=15
C : 기밀성 (보안)
I : 무결성 (C나라가 위조하면 무결성 깨짐)
A : 가용성 [내가 원하는 문서에 접근할 수 있는지 없는지 ( C나라에서 문서 위조 했으면 접근을 못 한거다)]
문서 암호화하면 기밀성이 유지된다.
그러면 가용성을 확보할 수 있다.
B나라에 A열쇠가 없으면 문서를 못 열어보니 가용성이 깨지는 것이다.
A나라는 B나라에 A열쇠를 전달해줘야 하는데
그러면 C나라에서 A열쇠를 훔칠 수 있다.
여기서 문제점
1. 열쇠 전달의 문제
a청군이 b청군에 문서 보냄
a청군은 b청군의 응답을 기다림
회신 온 문서는 b청군일 수도 있고 홍군이 가로챈 정보일 수도 있다.
여기서 문제점
2. 누구로부터 온 문서인가?
1. 열쇠 전달의 문제
2. 누구로부터 온 문서인가?
의 2문제를 해결하면 보안 이슈가 해결된다.
스프링부트 시큐리티 15강 - JWT를 이해하기전 RSA에 대해서 알아보자
https://www.youtube.com/watch?v=edyjcg7_Lyc&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=16
키 하나로 하는 건 시멘트릭키(대칭키)
공개키 개인키로 하는건..따로 찾아보자 (강사님 까묵함)
B공개키는 모두에게 알리고
B개인키는 B만 가진다.
정보를 보낼때
B공개키로 보낸 정보는 B개인키로만 열어 볼 수 있게 하면
1. 열쇠 전달의 문제
가 해결된다.
A공개키는 모두에게 알리고
A개인키는 B만 가진다.
정보를 보낼때
A개인키로 보낸 정보는 A공개키로만 열어 볼 수 있게 하면
2. 누구로부터 온 문서인가?
가 해결된다.
==>전자문서 (서명,인증)
특징 정리
공개키로 잠근건 개인키로 열어 볼 수 있고 (암호화)
개인키로 잠근건 공개키로 열어 볼 수 있다. (전자서명)
A가 B에게 메세지를 보낼건데
B공개키로만 보내면 해커가 조작할 수 있다.
B공개키로 보낼때 A개인키로 한번 더 잠근다.
그럼 프로토콜이 만들어지는데
1. 문서 받으면
2. A의 공개키로 열어본다.
=>안열리면 -> 인증(x) (해커짓)
=>열리면 -> 인증(0) -> B의 개인키로 열어본다 -> 1234 데이터 받을 수 있음.
스프링부트 시큐리티 16강 - JWT를 이해하기전 RFC문서란
https://www.youtube.com/watch?v=PnqpOgNS40I&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=17
여기 싸이트 가면 설명이 있다.
RFC 7519라는 문서가 있다.
210.10.7.5:8080?name=홍길동
이 규칙은 벨연구소에서 정한 RFC 1번 문서이다.
이 약속된 방식을 프로토콜이라 한다.
네트워크가 연결될 때마다 생기는 약속들.. 문서가 많아진다.
이걸 WWW 인터넷이라한다.
인터넷은 RFC 문서들로 이뤄져 있음.
이 약속이 http프로콜이다.
RFC7519에 만들어진 약속이 JWT이다.
JSON WEB TOKEN
얘를 배우면 굉장히 확장성이 좋은 서버를 구축할 수 있다.
스프링부트 시큐리티 17강 - JWT 구조 이해
https://www.youtube.com/watch?v=JY6qEnGRXic&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=18
JSON 웹 토큰이란?
정보를 JSON 객체로 안전하게 전송하기 위한 방식
디지털 서명이 되어 있으므로 신뢰할 수 있다.
JWT는 HMAC알고리즘 또는 RSA를 대상으로 한다.
JWT는 암호화를 위해 당사자간에 비밀을 제공 할 수도 있지만 서명된 토큰에 중점을 둔다.
서명된 토큰은 무결성을 확인할 수 있다.
JSON 웹 토큰의 구조
- Header
- Payload (정보를 의미)
- Signature (서명)
xxxxx-yyyyy.zzzzz
헤더는 이래 생김
Base64Url은 암호화와 복호화를 할 수 있다. (인코딩 디코딩)
이 말은 스프링에서 암호화를 하면 해쉬를 한 것이므로 복호화가 안된다.
찾으려면 비밀번호 초기화를 해야함.
-등록 된 클레임 : 중요하지 않음. 필수는 아님. 발행자, 만료기간, 주제, 청중에 대한 것
-개인 클레임 : 여기에 UserId 같은거 넣어 볼 거임. Primary Key를 여기 넣어줄 거임. 유저를 특정할 수 있음
페이로드는 저렇게 생겼다
여기에는 정보를 담을 수 있다.
"admin" : "true"는
-등록된 클레임이 아니라
-개인 클레임이다
내가 원하면 만들어낼 수 있는 것
여기에 UserId는 1 이런거 넣어줄거임.
서명은 이래 생김
서명엔 무엇을 넣냐면 우리가 만든
헤더,
페이로드 (정보),
secret(개인 키,나만 알고 있는거)
를 HMAC으로 암호화한다.
로컬 스토리지에 저장한다.
암호화보다 무결성에 집중된 것이다.
스프링부트 시큐리티 18강 - JWT 프로젝트 세팅
https://www.youtube.com/watch?v=IRh6Eh3pWEY&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=19
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.2</version>
</dependency>
얘가
이거 만들어주는 역할이다.
스프링부트 시큐리티 19강 - jwt를 위한 yml파일 세팅
https://www.youtube.com/watch?v=1bJH_Px_1sM&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=20
따로 시큐리티 안넣어줘도 시큐리티가 걸리네??
스프링부트 시큐리티 20강 - jwt를 위한 security 설정
https://www.youtube.com/watch?v=q_Rc_9o6zLU&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=21
이때까지 시큐리티랑 다른거는
23행,25행이 다르다.
스프링부트 시큐리티 21강 - jwt Bearer 인증 방식
https://www.youtube.com/watch?v=3qIYUnFSKdQ&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=22
스프링부트 시큐리티 22강 jwt FIlter 등록 테스트
https://www.youtube.com/watch?v=YUX9yGCIFHU&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=23
'Spring > Spring boot' 카테고리의 다른 글
스프링 부트 배포하기 (0) | 2022.02.24 |
---|---|
@RequestParam 과 @RequestBody (0) | 2022.02.12 |
JPA이용한 페이지 처리 참고 유툽 영상 (0) | 2022.02.05 |
JSP controller 부분 Spring GetMapping으로 변경 (0) | 2022.02.05 |
return "redirect:/login"; 과 유저 등급별 접근 참조 싸이트 (0) | 2022.02.02 |
댓글