분류 전체보기
![JWT/JWK](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtCVNl%2Fbtrm1h61GFo%2FxKRvhfDIlIROKXamu41WR0%2Fimg.png)
JWT/JWK
jwt 필요한 모든 정보를 지니고 있습니다. 토큰에 대한 기본정보, 전달 할 정보, 토큰이 검증됐다는것을 증명해주는 signature 형태 : head + "." + payload + "." +signature head -> 토큰의 타입 / 암호화 알고리즘 / Key id { "typ": "JWT", "kid": "OEqNw5/eh+ga7bhB4C6XTX8ON0/8BqCJ26Q0htJ63WA=", "alg": "RS256" } payload -> data 정보의 조각을 클레임이라 호칭 등록된 클레임 + 공개 클레임 + 비공개 클레임 등록된 클레임 -> 토큰에 대한 정보들을 담기 위하여 이미 정해진 클레임들 입니다. 공개 클레임 -> 보통 URI형식으로 짓습니다. 비공개 클레임 -> 클라이언트 서버 합의하..
![Ios Apple Native Login](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkPEgL%2Fbtrm2oZw5PF%2FPnvgaceFwekI5u2eRBdPok%2Fimg.png)
Ios Apple Native Login
TL;DR: 웹뷰의 애플 로그인만 네이티브 로그인으로 구현합니다. 14.5.1 이상 버전에서는 apple sign in with js가 동작하지 않습니다. safari의 이슈 때문에 안되는것으로 추측합니다. 적용해주시고 예외상황이 발생한다면 말씀해주세요 안드로이드는 애플로그인 apple sign in with js로 잘 됩니다. ios쪽 부분만 네이티브로 변경합니다. apple login은 ios 13.0 이상에서만 가능합니다. 문제 원인 파악 apple sign in with js 에서는 로그인 시도시 'https://appleid.apple.com/auth/authorize?client_id=[service_url]&redirect_uri[service_url]Fapple_redirect&respon..
![Ios App Memory Check](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvNRHh%2FbtrmYEI3V1p%2Fyf0jIC2ypxv0OK85hLRFf1%2Fimg.png)
Ios App Memory Check
Device에서 어플리케이션이 갑자기 멈추면서 꺼질때가 있는데 이때 app이 crash 났다고 합니다. 이유는 여러가지가 있을수 있는데 그 중 하나는 메모리를 너무 많이 사용하는 경우 입니다. 아래의 내용은 xcode로 현재 실행중인 어플리케이션의 memeory를 확인하고 더 나아가 디바이스에서 실행중인 모든 프로세스의 메모리 사용량을 체크하는 방법입니다. 나중에 언젠가 필요할 날이 있지 않은까 싶어서 기록합니다. 현재 실행중인 앱의 메모리 사용량 체크 어플리케이션을 실행시키고 빨간 네모안의 스프레이 같은 버튼을 누르시면 됩니다. 디바이스에서 현재 실행중인 프로세스 및 cpu, memory 사용량 아래 빨간 네모박스 안에 내용이 녹화 버튼인데 이걸 누르면 아래의 사진처럼 내용이 출력되기 시작합니다.
Android build.gradle 주요 정보 보안
buid.gradle 파일은 gitignore에 추가되어 있지 않습니다. git 저장소가 노출되면 빌드에 필요한 password나 키들에 대한 정보가 노출될 수 있습니다. 이는 곧 스토어에 올라가 있는 앱이 다른 앱으로 대체될 수 있다는 이야기 입니다. gradle 은 groovy 언어로 이루어진 빌드 도구 입니다. groovy언어와 local.properties 파일을 이용하여 이를 변경합니다. 변경 전 (key 값들은 임의의 값으로 대체 하겠습니다.) ... signingConfigs { debugConfig { storeFile file('../test.jks') storePassword 'test123' keyAlias 'test' keyPassword 'test123' } releaseConfi..
![최대 힙[백준 11279] - python](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmzmsq%2Fbtrm82nEnhE%2FTZ7z1oo02LKz5trDoK1Is0%2Fimg.png)
최대 힙[백준 11279] - python
최대 힙을 이용하여 구현하는 문제이다. 정답코드 먼저 살펴보자 import heapq import sys n = int(sys.stdin.readline()) heap = [] for i in range(n) : num = int(sys.stdin.readline()) if num == 0 and len(heap) == 0: print(0) elif num == 0 : print(heapq.heappop(heap)[1]) else : heapq.heappush(heap, (-num, num )) 문제에 나와있듯이 힙을 이용해야 겠다는 생각이 들었고 우선순위를 큰 값이 가장 먼저 나올수 있도록 -를 곱해서 거꾸로 넣어주었다. python에서 heapq를 사용하는 방법은 따로 포스팅을 할 예정이다. http..
![AC [백준 5430] - python](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx566a%2Fbtrm2n0ES0u%2Ff7qKuhkq31dKpKtFGIXm41%2Fimg.png)
AC [백준 5430] - python
이 문제는 구현이 어려웠던 문제는 아니고 그 안에 개념을 떠올리기가 쉽지 않았었던것 같다.(모든 알고리즘 문제가 그런건가...) 끝에 출력 이슈도 있었다..... t = int(input()) def func(x) : if x != '' : return int(x) for _ in range(t) : commands = list(input()) n = input() array = list(filter(lambda x : x != None, list(map(func, input().replace('[', '').replace(']', '').split(','))))) flag = True reverse_count = 0 for cmd in commands : if cmd == 'R' : reverse_co..
![버블 소트[백준 1377] - python](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv8oGR%2FbtrmYdrnWxk%2FQGXu3VAGZ6wnDVtTacli60%2Fimg.png)
버블 소트[백준 1377] - python
버블 소트가 배열의 원소 별로 사이클이 몇번 시행되어야 하는 지를 출력하는 문제다 하나의 숫자가 제위치로 가는 순간을 사이클 하나로 정의해보자 당연히 그냥 버블소트를 생으로 구현해서 출력하면 시간초과이다. 10 1 5 2 3 의 예시를 보면 10과 5에 대한 버블소트 사이클이 시행되어야 한다. 정렬된 상태는 1이 되므로 두번 버블소트 사이클이 시행되면 결과는 3이 된다. 1 3 5 7 9가 입력으로 주어지면 1을 출력하면 된다. 정답 코드 먼저 살펴보자 n = int(input()) array = [] for i in range(n) : n = int(input()) array.append((n, i)) sorted_array = sorted(array) answer = 0 for i in range(n..
![후위 표기식[백준 1918] - python](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp00kc%2FbtrmYFnxaTH%2FJrXTk51vBwDLPibbfbhZDK%2Fimg.png)
후위 표기식[백준 1918] - python
꽤나 애를 먹었었던 문제 정답 코드 먼저 살펴보자 n = list(input()) operator = {'(': 1, '+': 2, '-': 2, '*': 3, '/': 3} result = "" stack = [] for i in n : if i == '(' : stack.append(i) elif i == ')' : top = stack.pop() while stack and top != '(' : result += top top = stack.pop() elif i in operator : while stack and operator[stack[len(stack) - 1]] >= operator[i] : top = stack.pop() if i != '(' : result += top stack.a..
![kt 먹통에서 등장하는 네트워크 이슈 및 용어 얕은 정리](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYNwBj%2Fbtrm5y8gRnY%2FD08SAgoLNglXbRnIKlkehk%2Fimg.png)
kt 먹통에서 등장하는 네트워크 이슈 및 용어 얕은 정리
지난 kt 유무선 인터넷 장애가 일어난 원인을 살펴보고 여기서 건질만한 네트워크 개념이나 이슈를 파악해보자 10월 25일 오전에 갑자기 사내 와이파이가 멈추었다. 주위의 모든 사람들에게 같은 현상이 발견되었고, 일을 해야 했기에 핸드폰(skt 사용)의 핫스팟을 사용하여 작업을 계속 진행하였었다. 한시간 반정도 지났을까 와이파이는 다시 동작하였고 kt의 유무선 인터넷 장애가 그 원인이었다는 것이 확인되었다. kt에서는 당일 ddos의 공격으로 인해 발생한 현상이었다고 발표했었다. 그러나 다시 내부설정 오류로 인한 것이라고 발표했었던걸로 기억이 난다. 해당 사건에 관한 주요 기사의 인용문을 살펴보자 지난 10월 25일 11시 16분 부터 KT DNS서버에서 평시에 비해 트래픽이 급증하였다. 중앙 1차 DNS..
이진탐색, bisect_left, bisect_right
* 잘못된 정보가 있으면 말씀해주세요. 빠른 반영 하겠습니다! 이진탐색을 사용하면 O(logn)의 시간복잡도를 가지게 되는데요 [0, 10, 20, 30, 40, 41, 42, 42, 43, 44, 45, 50, 60, 61] 의 배열이 있다고 가정하겠습니다 50을 찾겠습니다. 1. 중간값 42와 50을 비교 -> 42보다 50이 큼 -> [42, 43, 44, 45, 50, 60, 61]에서 찾음 2. [42, 43, 44, 45, 50, 60]의 중간값 44 와 50을 비교 -> 44보다 50이 큼 -> [45, 50, 60, 61]에서 찾음 3. [45, 50, 60, 61] 의 중간값 60과 50을 비교 -> 60이 50보다 큼 -> [45, 50]에서 찾음 4. [45, 50]의 중간값 45와 ..